Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
程序员文章站
2024-03-07 10:51:56
一般大家对小文件的解决办法是直接在服务端读取文件,然后输出,这样就避免了文件地址的暴露,这是一种解决办法。而我现在想说的是使用 transmitfile 方法直接输出文件,...
一般大家对小文件的解决办法是直接在服务端读取文件,然后输出,这样就避免了文件地址的暴露,这是一种解决办法。而我现在想说的是使用 transmitfile 方法直接输出文件,但是这个方法对大文件的支撑力度有多少,以及会带来多大的性能开销,我还没有测试过,有兴趣的朋友可以测试下,并发表评论。
好了,进入正题,一般对下载站,大家想到的就是流量的问题,所以自动就想到应该把文件与程序代码分开部署。所以我给文件单独做了一个二级域名,我们就叫 file.xxx.com 吧。主网站域名就是 www.xxx.com了,或者其他二级域名都行。
那第一步就是先要实现这2个站点之间的身份验证共享了,比如登陆了主站后自动分站就实现登录了,那.net的forms身份验证很容易的就能实现这个功能,底层思路其实就是共享cookie的原理。第二部就是给文件站做权限过滤。下面我们给主站以及文件站同时添加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>
<!--此节点只需加到文件站下--> <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("您未登录!");
}
}
}
}
写完以上代码后,那就是增加过滤配置了,注意上面的配置文件注释,最主要的配置节:<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节点下就可以了。
好了,进入正题,一般对下载站,大家想到的就是流量的问题,所以自动就想到应该把文件与程序代码分开部署。所以我给文件单独做了一个二级域名,我们就叫 file.xxx.com 吧。主网站域名就是 www.xxx.com了,或者其他二级域名都行。
那第一步就是先要实现这2个站点之间的身份验证共享了,比如登陆了主站后自动分站就实现登录了,那.net的forms身份验证很容易的就能实现这个功能,底层思路其实就是共享cookie的原理。第二部就是给文件站做权限过滤。下面我们给主站以及文件站同时添加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>
<!--此节点只需加到文件站下--> <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("您未登录!");
}
}
}
}
写完以上代码后,那就是增加过滤配置了,注意上面的配置文件注释,最主要的配置节:<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节点下就可以了。