Web.Config配置如下:
整个IHttpHandler实现代码如下:
/// 本HttpHanderPowerControls可以控制权限,但是在使用AjaxPro的时候AjaxPro.Utility.RegisterTypeForAjax需要指定第二个参数,否则会报错
/// 如:AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default),Page);
/// </summary>
public class HttpHanderPowerControls : IHttpHandler, IRequiresSessionState
{
/// <summary>
/// 获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
/// </summary>
public bool IsReusable
{
get { return true ; }
}
public void ProcessRequest(HttpContext context)
{
HttpSessionState session = context.Session;
// 权限判断
if (session[ " uname " ] != null && ! string .IsNullOrEmpty(session[ " uname " ].ToString()))
{
// Type type = BuildManager.GetCompiledType(path);
// ASP.NET 1.1使用以下语句获得IHttpHandler
// context.Server.Transfer(PageParser.GetCompiledPageInstance(path, context.Request.PhysicalPath, context),true);
// AjaxPro.Utility.RegisterTypeForAjax(type, handler as Page);
context.Server.Transfer(BuildManager.CreateInstanceFromVirtualPath(context.Request.Path, typeof (Page)) as IHttpHandler, true );
}
else
{
context.Server.Transfer( " /login.aspx " );
}
}
}
代码说明:
1. 这里我只截获.aspx的文件请求访问,所以CreateInstanceFromVirtualPath第二个参数指定成typeof(Page)就行了,当然也可以用BuildManager.GetCompiledType(path)获得它的Type,调试的时候我发现这行代码比较费时间,而且也不需要就直接用了Page了
2. BuildManager.CreateInstanceFromVirtualPath 方法 MSDN说法:处理给定了虚拟路径的文件,并创建结果的实例。 [分享]在自定义的HttpHandler中调用.net默认HttpHandler的方法 提供的是我注释掉的部分,是ASP.NET 1.1使用,当然2.0下也能使用!
流程说明:
用户访问根目录下/page目录下的aspx页面,将被HttpHanderPowerControls截获,在ProcessRequest里进行权限判断,如果有权限的话继续执行页面(手动创建编译指定的页面的实例);如果没有权限,跳转到login页面。
注意问题:
1. 在使用AjaxPro的时候AjaxPro.Utility.RegisterTypeForAjax需要指定第二个参数,例如:AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default),Page);
指定为Page就行了,否则会报错显示类型转换失败!
2. path的匹配问题,他不能匹配子目录内的文件,支持简单的*、?通配符,例如:/page/* -> 就只能匹配page目录下的文件 /page/*/* -> 能匹配page目录下任意一级子目录下的文件。
3. 在使用验证码的时候注意了,如果也是用Page页返回并且在权限控制范围内的话注意要过滤掉!
遗留问题:
1. 这样做到底会不会造成性能上的损害?!
2. 对于属性IsResult仍然持不理解状态!
本文转自博客园农民伯伯的博客,原文链接:使用IHttpHandler做权限控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName],如需转载请自行联系原博主。