实现IHttpHandler接口来控制文件下载权限

今天碰到了一个很棘手的问题,由于原来从来没做过这方面的考虑,所以一上来就把我搞蒙了,还好baidu,google了半天(连迅雷都用上了。。。)终于解决了这个问题。

 

如果你想控制某个.aspx页面不让未授权用户访问,那么写个web.config就OK了,但是如果你想控制rar,zip……等等文件的访问就不是这么简单的了,有人说隐藏下载地址,用session判断啊什么的,我觉得这纯属是对付,万一哪个哥们没事干就再那猜地址呢,如果是给小日本写程序,那这么写没问题。有一种办法不错,也不难。嘿嘿,为什么.aspx页面写个web.config就可以控制了呢,因为你服务器上装了.net(想抽我是吧?哈哈),因为aspreg_iis.exe后iis中映射里的.aspx等等文件的受理请求全部移交到了c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll这个文件来受理(版本不同,文件不同),所以它知道在你没有登录的时候把你直接推到login.aspx页面去,这也就是为什么.aspx文件能控制访问,而rar,zip等等文件无法控制了。

 

继续说,为什么aspx文件能控制呢,因为M$在aspnet_isapi.dll里书写了关于aspx类型的处理,所以只要写个关于rar文件的处理就OK了。

步骤如下:

1)写一个实现了IHttpHandler接口的类。

将此文件保存到~/App_Code/RarFileHandler.cs

代码如下(里面有点多余代码是为了其他的判断):

using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; ///

///RarFileHandler 的摘要说明 /// public class RarFileHandler:IHttpHandler { public RarFileHandler() { // //TODO: 在此处添加构造函数逻辑 // } #region IHttpHandler 成员 public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { string strFileFullName = context.Server.MapPath(context.Request.FilePath); string[] spiltName = strFileFullName.Split('//'); if (spiltName.Length < 2) return; //获得路径中的用户名 string currentUserName = spiltName[spiltName.Length - 2]; //当前用户访问的是其自己的文家夹 if (context.User.Identity.Name == currentUserName.ToUpper()) { //rar's MIME context.Response.ContentType = "application/octet-stream"; context.Response.WriteFile(strFileFullName); } } #endregion }

 

2)写~/Web.config文件,内容如下:

 

3)配置一下IIS的类型映射

网站目录->属性->配置->映射->添加

 

可执行文件:c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll

扩展名:.rar

 

如图:

实现IHttpHandler接口来控制文件下载权限_第1张图片

你可能感兴趣的:(.Net)