使用IHttpHandler做权限控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName]

简介:

正文

     Web.Config配置如下:

< add  verb ="POST,GET"  path ="/page/*.aspx,/page/*/*.aspx,/page/*/*/*.aspx,/page/*/*/*/*.aspx,/page/*/*/*/*/*.aspx"  type ="WebLibrary.PowerManage.HttpHanderPowerControls" />

     整个IHttpHandler实现代码如下:

     ///   <summary>
    
///  本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仍然持不理解状态!

 

结束

     欢迎大家交换意见,继续探索权限控制方面在ASP.NET中的解决方案:)



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586473,如需转载请自行联系原作者

相关文章
|
XML 安全 Java
自定义PMD检测的类型集合(详解)
自定义PMD检测的类型集合(详解)
自定义PMD检测的类型集合(详解)
测试闭环
一、需求评审 1.需求评审的目的 明确功能优先级,评审业务流程设计的合理性,评估技术可行性。 2.需求评审中注意事项 a)提前了解产品需求,明确核心流程、功能结构 b)评审过程中不避免乏味,时间越长越容易分心,所以先了解重点模块,循序渐进 c)评审中遇到争议点,避免发散讨论,引导大家快速决策,明确沟通,明确产品拍板 d)评审中遇到无法决策的点,记录下来,会后处理,不过多纠缠,后续让产品决策后更新需求文档。
4030 0
|
缓存 开发框架 算法
.NET操作Excel高效低内存的开源框架 - MiniExcel
.NET操作Excel高效低内存的开源框架 - MiniExcel
412 0
.NET操作Excel高效低内存的开源框架 - MiniExcel
|
前端开发 定位技术
地图开发实战案例:高德地图的标注、信息窗口的实战实例
地图开发实战案例:高德地图的标注、信息窗口的实战实例
334 0
|
开发者
手把手教你使用ADB卸载手机内置App软件
使用ADB卸载手机内置App软件教程
2850 0
手把手教你使用ADB卸载手机内置App软件
|
存储 运维 监控
AWS S3 Lens使用简介
本文主要对S3 Lens的基本功能及如何使用进行介绍
704 0
|
存储 弹性计算 块存储
阿里云服务器收费价格在哪查看?在云服务器ECS页面即可查询(计算器)
阿里云服务器1核1G云服务器S6配置0.9元一个月,1核2G1M配置1.90元一个月,2核1G3M带宽6元一个月,2核4G服务器40.98元3个月,4核8G服务器73.38元3个月,8核16G服务器138.18元三个月
1472 0
阿里云服务器收费价格在哪查看?在云服务器ECS页面即可查询(计算器)
|
安全 开发者
新能力|分账明白,账本清楚,商家超轻松
目前,商家分账 功能已经全面开放给企业商户,快来了解一下吧。
2937 12
新能力|分账明白,账本清楚,商家超轻松
|
存储 弹性计算 边缘计算
科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?
科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?
661 0
科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?