Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
2012-02-14 17:25
846 查看
我们平时一般在做图片或者文件下载权限控制的时候基本都是控制到下载页面的,当你的下载地址暴露后,浏览者就直接可以通过文件地址进行下载了,这时候也就出现了我们常说的盗链。
一般大家对小文件的解决办法是直接在服务端读取文件,然后输出,这样就避免了文件地址的暴露,这是一种解决办法。而我现在想说的是使用TransmitFile方法直接输出文件,但是这个方法对大文件的支撑力度有多少,以及会带来多大的性能开销,我还没有测试过,有兴趣的朋友可以测试下,并发表评论。
好了,进入正题,一般对下载站,大家想到的就是流量的问题,所以自动就想到应该把文件与程序代码分开部署。所以我给文件单独做了一个二级域名,我们就叫file.xxx.com吧。主网站域名就是www.xxx.com了,或者其他二级域名都行。
那第一步就是先要实现这2个站点之间的身份验证共享了,比如登陆了主站后自动分站就实现登录了,那.Net的Forms身份验证很容易的就能实现这个功能,底层思路其实就是共享Cookie的原理。第二部就是给文件站做权限过滤。下面我们给主站以及文件站同时添加web.config。给他们加入相同的配置,Web.config主要配置代码如下:
一般大家对小文件的解决办法是直接在服务端读取文件,然后输出,这样就避免了文件地址的暴露,这是一种解决办法。而我现在想说的是使用TransmitFile方法直接输出文件,但是这个方法对大文件的支撑力度有多少,以及会带来多大的性能开销,我还没有测试过,有兴趣的朋友可以测试下,并发表评论。
好了,进入正题,一般对下载站,大家想到的就是流量的问题,所以自动就想到应该把文件与程序代码分开部署。所以我给文件单独做了一个二级域名,我们就叫file.xxx.com吧。主网站域名就是
那第一步就是先要实现这2个站点之间的身份验证共享了,比如登陆了主站后自动分站就实现登录了,那.Net的Forms身份验证很容易的就能实现这个功能,底层思路其实就是共享Cookie的原理。第二部就是给文件站做权限过滤。下面我们给主站以及文件站同时添加web.config。给他们加入相同的配置,Web.config主要配置代码如下:
<?xmlversion="1.0"encoding="UTF-8"?> <configuration> <connectionStrings> </connectionStrings> <appSettings> </appSettings> <system.web> <authenticationmode="Forms"> <formsloginUrl="~/Home/LogOn"defaultUrl="/"timeout="600"slidingExpiration="true"name="File"path="/"enableCrossAppRedirects="true"></forms> </authentication>
<httpCookiesdomain=".xxx.com"/> <machineKeyvalidationKey="AAA977D304FB289C182E00C710A099C9F92986DC25AD69F8"decryptionKey="AAA2B3F76A9359431E717CA8275EE72EEEDC70ED55152010"validation="SHA1"/> </system.web>
<!--此节点只需加到文件站下-->
<system.webServer> <handlers> <addname="*.*"path="*.*"verb="*"type="Web.Handler.Download"/> </handlers> </system.webServer> </configuration>
以上配置文件针对跨域访问的几个关键配置点:
一:authentication的name要相同,path="/"表示cookie存储路径为根域名,enableCrossAppRedirects="true"表示身份验证是否可以重定向到其他应用程序。
二:httpCookie节点配置为顶级域名。
三:两个站点的machinekey必须相同。
那针对权限控制,通过实现.Net里面的访问过滤器,也就是IHttpHandler接口,用来拦截访问。实现方法也很简单,只要实现ProcessRequest方法就可以了,下面是我的代码:
namespaceWeb.Handler
{
///<summary>
///文件下载登陆验证
///</summary>
publicclassDownload:IHttpHandler
{
publicboolIsReusable
{
get
{
returntrue;
}
}
publicvoidProcessRequest(HttpContextcontext)
{
if(context.User.Identity.IsAuthenticated)
{
stringfileName=context.Server.MapPath(context.Request.FilePath);
context.Response.ContentType=Path.GetExtension(fileName);
context.Response.TransmitFile(context.Request.FilePath);
}
else
{
context.Response.Write("您未登录!");
}
}
}
}
写完以上代码后,那就是增加过滤配置了,注意上面的配置文件注释,最主要的配置节:
<addname="*.*"path="*.*"verb="*"type="Web.Handler.Download"/>
name是筛选器的名称,随便填,path表示你要过滤的文件后缀,我是所有文件都需要过滤,所以直接用*.*,如果单纯只过滤jpg跟gif,可以改为:*.jpg,*.gif即可,type表示过滤器Dll地址,也就是我们实现IHttpHandler的类全名,ok,文件访问控制就已经完成了。
注意:由于我使用的是IIS7,所以此处的Handler添加到了system.webSever节点下,IIS6及以下版本直接添加到system.web节点下就可以了。
转载自:http://www.cnblogs.com/hyperlinker/archive/2012/02/14/2351193.html
相关文章推荐
- Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
- Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
- 【原创】Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
- Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
- asp.net forms 身份验证方式下跨域登录信息共享的实现方法
- asp.net Forms身份验证和基于角色的权限访问
- Asp.Net Forms身份验证和基于角色的权限访问
- 给Asp.net MVC Forms 验证设置角色访问控制
- 两系统用asp.net forms 身份验证方式实现跨域登录信息共享
- asp.net forms身份验证控制
- 给Asp.net MVC Forms 验证设置角色访问控制
- asp.net登录 用Forms身份验证和基于角色的分目录访问
- asp.net forms 身份验证方式下跨域登录信息共享的实现方法
- asp.net Forms身份验证和基于角色的权限访问
- Asp.net中基于Forms验证的角色验证授权
- Asp.net中基于Forms验证的角色验证授权
- 关于asp.net中forms身份验证
- asp.net Forms 身份验证
- 详解ASP.NET Core和ASP.NET Framework共享身份验证
- Asp.net中基于Forms验证的角色验证授权