Asp.Net二級(jí)域名共享Forms身份驗(yàn)證、下載站/圖片站的授權(quán)訪問(wèn)控制
更新時(shí)間:2012年02月14日 22:00:42 作者:
我們平時(shí)一般在做圖片或者文件下載權(quán)限控制的時(shí)候基本都是控制到下載頁(yè)面的,當(dāng)你的下載地址暴露后,瀏覽者就直接可以通過(guò)文件地址進(jìn)行下載了,這時(shí)候也就出現(xiàn)了我們常說(shuō)的盜鏈
一般大家對(duì)小文件的解決辦法是直接在服務(wù)端讀取文件,然后輸出,這樣就避免了文件地址的暴露,這是一種解決辦法。而我現(xiàn)在想說(shuō)的是使用 TransmitFile 方法直接輸出文件,但是這個(gè)方法對(duì)大文件的支撐力度有多少,以及會(huì)帶來(lái)多大的性能開(kāi)銷,我還沒(méi)有測(cè)試過(guò),有興趣的朋友可以測(cè)試下,并發(fā)表評(píng)論。
好了,進(jìn)入正題,一般對(duì)下載站,大家想到的就是流量的問(wèn)題,所以自動(dòng)就想到應(yīng)該把文件與程序代碼分開(kāi)部署。所以我給文件單獨(dú)做了一個(gè)二級(jí)域名,我們就叫 file.xxx.com 吧。主網(wǎng)站域名就是 www.xxx.com了,或者其他二級(jí)域名都行。
那第一步就是先要實(shí)現(xiàn)這2個(gè)站點(diǎn)之間的身份驗(yàn)證共享了,比如登陸了主站后自動(dòng)分站就實(shí)現(xiàn)登錄了,那.Net的Forms身份驗(yàn)證很容易的就能實(shí)現(xiàn)這個(gè)功能,底層思路其實(shí)就是共享Cookie的原理。第二部就是給文件站做權(quán)限過(guò)濾。下面我們給主站以及文件站同時(shí)添加web.config。給他們加入相同的配置,Web.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>
<!--此節(jié)點(diǎn)只需加到文件站下--> <system.webServer>
<handlers>
<add name="*.*" path="*.*" verb="*" type="Web.Handler.Download" />
</handlers>
</system.webServer>
</configuration>
以上配置文件針對(duì)跨域訪問(wèn)的幾個(gè)關(guān)鍵配置點(diǎn):一:authentication的name要相同,path="/" 表示cookie存儲(chǔ)路徑為根域名,enableCrossAppRedirects="true" 表示身份驗(yàn)證是否可以重定向到其他應(yīng)用程序。二:httpCookie節(jié)點(diǎn)配置為頂級(jí)域名。三:兩個(gè)站點(diǎn)的machinekey必須相同。 那針對(duì)權(quán)限控制,通過(guò)實(shí)現(xiàn).Net里面的訪問(wèn)過(guò)濾器,也就是IHttpHandler接口,用來(lái)攔截訪問(wèn)。實(shí)現(xiàn)方法也很簡(jiǎn)單,只要實(shí)現(xiàn)ProcessRequest方法就可以了,下面是我的代碼:
namespace Web.Handler
{
/// <summary>
/// 文件下載登陸驗(yàn)證
/// </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("您未登錄!");
}
}
}
}
寫(xiě)完以上代碼后,那就是增加過(guò)濾配置了,注意上面的配置文件注釋,最主要的配置節(jié):<add name="*.*" path="*.*" verb="*" type="Web.Handler.Download" /> name是篩選器的名稱,隨便填,path表示你要過(guò)濾的文件后綴,我是所有文件都需要過(guò)濾,所以直接用*.*,如果單純只過(guò)濾jpg跟gif,可以改為:*.jpg,*.gif 即可,type表示過(guò)濾器Dll地址,也就是我們實(shí)現(xiàn)IHttpHandler的類全名,ok,文件訪問(wèn)控制就已經(jīng)完成了。 注意:由于我使用的是IIS7,所以此處的Handler添加到了system.webSever節(jié)點(diǎn)下,IIS6及以下版本直接添加到system.web節(jié)點(diǎn)下就可以了。
好了,進(jìn)入正題,一般對(duì)下載站,大家想到的就是流量的問(wèn)題,所以自動(dòng)就想到應(yīng)該把文件與程序代碼分開(kāi)部署。所以我給文件單獨(dú)做了一個(gè)二級(jí)域名,我們就叫 file.xxx.com 吧。主網(wǎng)站域名就是 www.xxx.com了,或者其他二級(jí)域名都行。
那第一步就是先要實(shí)現(xiàn)這2個(gè)站點(diǎn)之間的身份驗(yàn)證共享了,比如登陸了主站后自動(dòng)分站就實(shí)現(xiàn)登錄了,那.Net的Forms身份驗(yàn)證很容易的就能實(shí)現(xiàn)這個(gè)功能,底層思路其實(shí)就是共享Cookie的原理。第二部就是給文件站做權(quán)限過(guò)濾。下面我們給主站以及文件站同時(shí)添加web.config。給他們加入相同的配置,Web.config主要配置代碼如下:
復(fù)制代碼 代碼如下:
<?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>
<!--此節(jié)點(diǎn)只需加到文件站下--> <system.webServer>
<handlers>
<add name="*.*" path="*.*" verb="*" type="Web.Handler.Download" />
</handlers>
</system.webServer>
</configuration>
以上配置文件針對(duì)跨域訪問(wèn)的幾個(gè)關(guān)鍵配置點(diǎn):一:authentication的name要相同,path="/" 表示cookie存儲(chǔ)路徑為根域名,enableCrossAppRedirects="true" 表示身份驗(yàn)證是否可以重定向到其他應(yīng)用程序。二:httpCookie節(jié)點(diǎn)配置為頂級(jí)域名。三:兩個(gè)站點(diǎn)的machinekey必須相同。 那針對(duì)權(quán)限控制,通過(guò)實(shí)現(xiàn).Net里面的訪問(wèn)過(guò)濾器,也就是IHttpHandler接口,用來(lái)攔截訪問(wèn)。實(shí)現(xiàn)方法也很簡(jiǎn)單,只要實(shí)現(xiàn)ProcessRequest方法就可以了,下面是我的代碼:
復(fù)制代碼 代碼如下:
namespace Web.Handler
{
/// <summary>
/// 文件下載登陸驗(yàn)證
/// </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("您未登錄!");
}
}
}
}
寫(xiě)完以上代碼后,那就是增加過(guò)濾配置了,注意上面的配置文件注釋,最主要的配置節(jié):<add name="*.*" path="*.*" verb="*" type="Web.Handler.Download" /> name是篩選器的名稱,隨便填,path表示你要過(guò)濾的文件后綴,我是所有文件都需要過(guò)濾,所以直接用*.*,如果單純只過(guò)濾jpg跟gif,可以改為:*.jpg,*.gif 即可,type表示過(guò)濾器Dll地址,也就是我們實(shí)現(xiàn)IHttpHandler的類全名,ok,文件訪問(wèn)控制就已經(jīng)完成了。 注意:由于我使用的是IIS7,所以此處的Handler添加到了system.webSever節(jié)點(diǎn)下,IIS6及以下版本直接添加到system.web節(jié)點(diǎn)下就可以了。
您可能感興趣的文章:
- 淺談asp.net Forms身份驗(yàn)證詳解
- 詳解ASP.NET MVC Form表單驗(yàn)證
- 關(guān)于C#.net winform程序驗(yàn)證moss的集成身份認(rèn)證實(shí)例
- ASP.NET Internet安全Forms身份驗(yàn)證方法
- asp.net forms身份驗(yàn)證,避免重復(fù)造輪子
- asp.net 基于forms驗(yàn)證的目錄角色權(quán)限的實(shí)現(xiàn)
- asp.net Forms身份驗(yàn)證和基于角色的權(quán)限訪問(wèn)
- asp.net 特定目錄form驗(yàn)證
- ASP.net Forms驗(yàn)證Demo
- .net MVC使用IPrincipal進(jìn)行Form登錄即權(quán)限驗(yàn)證(3)
相關(guān)文章
如何實(shí)現(xiàn)ListView高效分頁(yè)代碼
ListView選擇自動(dòng)分頁(yè)時(shí) 其實(shí)就是添加了一個(gè)DataPager分頁(yè)控件兩者間存在著嵌套關(guān)系《Repeater與ListView》中提到這樣的分頁(yè)并不是高效的 因?yàn)閿?shù)據(jù)源還是返回了所有的數(shù)據(jù) 而非當(dāng)前頁(yè)數(shù)據(jù)2013-02-02
ajaxToolkit:ModalPopupExtender演示及實(shí)現(xiàn)代碼
ajaxToolkit:ModalPopupExtender可以讓用戶模擬新開(kāi)一個(gè)窗口,就是在模擬新開(kāi)窗口作多項(xiàng)選項(xiàng)的功能,感興趣的朋友可以了解下,希望此文對(duì)你有所幫助2013-01-01
利用asp.net實(shí)現(xiàn)生成不重復(fù)訂單號(hào)
訂單號(hào)在購(gòu)物過(guò)程中起到了很好的識(shí)別作用,更方便的有利于工作人員識(shí)別商品,本文介紹利用asp.net實(shí)現(xiàn)生成訂單號(hào)2012-12-12
ASP.NET Core 7 Razor Pages項(xiàng)目發(fā)布到IIS的詳細(xì)過(guò)程
這篇文章主要介紹了ASP.NET Core 7 Razor Pages項(xiàng)目發(fā)布到IIS的詳細(xì)過(guò)程,詳細(xì)介紹了發(fā)布過(guò)程遇到的問(wèn)題及解決方法,對(duì)ASP.NET Core 發(fā)布到IIS相關(guān)知識(shí)感興趣的朋友一起看看吧2023-01-01
asp.net DataList與Repeater用法區(qū)別
Repeater比DataList要好一些,如果不是很大數(shù)據(jù)量的話,這點(diǎn)差別是體現(xiàn)不來(lái)的。2009-12-12
ASP.NET實(shí)現(xiàn)按拼音碼模糊查詢的方法
我們?cè)谧鰯?shù)據(jù)錄入或者查詢的時(shí)候,經(jīng)常需要實(shí)現(xiàn)按用戶輸入的拼音碼進(jìn)行數(shù)據(jù)的模糊查詢功能,本文為大家介紹ASP.NET如何實(shí)現(xiàn)按拼音碼模糊查詢,需要的朋友可以參考下2015-09-09
asp.net動(dòng)態(tài)產(chǎn)生checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)
動(dòng)態(tài)產(chǎn)生一組checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)且post提交時(shí)后臺(tái)能及時(shí)獲取等等,打算使用repeater+input(checkbox)+input(hidden)來(lái)實(shí)現(xiàn)2013-10-10

