今天碰到了一个很棘手的问题,由于原来从来没做过这方面的考虑,所以一上来就把我搞蒙了,还好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
代码如下(里面有点多余代码是为了其他的判断):
Code
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;
/// <summary>
///RarFileHandler 的摘要说明
/// </summary>
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文件,内容如下:
Code
<system.web>
<httpHandlers>
<!--处理下载RAR文件的权限管理-->
<add verb="*" path="*.rar" type="RarFileHandler"/>
</httpHandlers>
</system.web>
3)配置一下IIS的类型映射
网站目录->属性->配置->映射->添加
可执行文件:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
扩展名:.rar
如图:
4)去厕所释放一下。。。