天天看点

使用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了

     流程说明:

               用户访问根目录下/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仍然持不理解状态!

继续阅读