【オリジナル】Asp.Net 2級ドメイン名共有Forms認証、ダウンロード局/ピクチャー局の許可アクセス制御
6189 ワード
私达はふだん普通はピクチャーあるいはファイルのダウンロードの権限の制御をする时基本的にすべてダウンロードのページに制御して、あなたのダウンロードの住所が暴露する时、閲覧者は直接ファイルの住所を通じてダウンロードすることができて、この时も私达のよく言う盗鎖が现れました.
一般的に、小さなファイルの解決策は、サービス側で直接ファイルを読み取り、出力することで、ファイルアドレスの露出を避けることができます.これは解決策です.私が今言いたいのはTransmitFileの方法を使って直接ファイルを出力することですが、この方法は大きなファイルに対する支持力がどれだけあるか、そしてどれだけの性能オーバーヘッドをもたらすか、私はまだテストしたことがありません.興味のある友达はテストして、コメントを発表することができます.
さて、本題に入ります.一般的にダウンロードステーションでは、トラフィックの問題を考えているので、ファイルとプログラムコードを別々に配置すべきだと自動的に考えられます.だから私はファイルに単独で2級ドメイン名を作って、私たちはfileと言います.xxx.comでしょう.主なウェブサイトのドメイン名はwww.xxx.comで、あるいはその他の2級のドメイン名はすべてできます.
その第一歩は、まず、この2つのサイト間の認証共有を実現することであり、例えば、マスタ局にログインすると自動的に分局してログインを実現することである.NetのForms認証は簡単に実現できますが、下位の考え方はCookieを共有する原理です.第2部はファイルステーションに権限フィルタリングを行うことです.次に、メインステーションとファイルステーションにwebを同時に追加します.config.彼らに同じ構成を加えるconfigの主な構成コードは以下の通りです.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<connectionStrings>
</connectionStrings>
<appSettings>
</appSettings>
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Home/LogOn" defaultUrl="/" timeout="600" slidingExpiration="true" name="File" path="/" enableCrossAppRedirects="true"></forms>
</authentication>
<httpCookies domain=".xxx.com"/>
<machineKey validationKey="AAA977D304FB289C182E00C710A099C9F92986DC25AD69F8" decryptionKey="AAA2B3F76A9359431E717CA8275EE72EEEDC70ED55152010" validation="SHA1"/>
</system.web>
<!-- -->
<system.webServer>
<handlers>
<add name="*.*" path="*.*" verb="*" type="Web.Handler.Download" />
</handlers>
</system.webServer>
</configuration>
:
:authentication name ,path="/" cookie ,enableCrossAppRedirects="true" 。
:httpCookie 。
: machinekey 。
, .Net , IHttpHandler , 。 , ProcessRequest , :
namespace Web.Handler
{
/// <summary>
///
/// </summary>
public class Download : IHttpHandler
{
public bool IsReusable
{
get
{
return true;
}
}
public void ProcessRequest(HttpContext context)
{
if (context.User.Identity.IsAuthenticated)
{
string fileName = context.Server.MapPath(context.Request.FilePath);
context.Response.ContentType = Path.GetExtension(fileName);
context.Response.TransmitFile(context.Request.FilePath);
}
else
{
context.Response.Write(" !");
}
}
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
, , , :
<add name="*.*" path="*.*" verb="*" type="Web.Handler.Download" />
name , ,path , , *.*, jpg gif, :*.jpg,*.gif ,type Dll , IHttpHandler ,ok, 。
: IIS7, Handler system.webSever ,IIS6 system.web 。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }