使用httpModule做权限系统

来源:互联网 发布:python开发一个软件 编辑:程序博客网 时间:2024/05/28 15:14

reference:

http://blog.csdn.net/andyhooo/archive/2007/04/29/1591890.aspx

http://topic.csdn.net/t/20050417/19/3944040.html

http://www.cnblogs.com/fanrsh/archive/2006/05/24/408136.html

  

  

页面请求过程:

  

  

根据这个流程,网上一般的权限验证在:

Http.Module.AuthorizeRequest

Http.Module.PreRequestHandlerExecute 

  

例如使用前者:

using System;

using System.Web;

using System.Security.Principal;

namespace MyModules

{

    public class CustomModule : IHttpModule

    {

        public CustomModule() { }

        public void Dispose() { }

        public void Init(HttpApplication app)

        {

            //建立安全模块   

            app.AuthenticateRequest += new EventHandler(this.AuthenticateRequest);

        }

  

        private void AuthenticateRequest(object o, EventArgs e)

        {

            HttpApplication app = (HttpApplication)o;

            HttpContext content = (HttpContext)app.Context;

  

            if ((app.Request["userid"] == null) || (app.Request["password"] == null))

            {

                content.Response.Write("未提供必需的参数!!");

                content.Response.End();

            }

  

            string userid = app.Request["userid"].ToString();

            string password = app.Request["password"].ToString();

            string[] strRoles = AuthenticateAndGetRoles(userid, password);

            if ((strRoles == null) || (strRoles.GetLength(0) == 0))

            {

                content.Response.Write("未找到相配的角色!!");

                app.CompleteRequest();

            }

            GenericIdentity objIdentity = new GenericIdentity(userid, "CustomAuthentication");

            content.User = new GenericPrincipal(objIdentity, strRoles);

        }

  

        private string[] AuthenticateAndGetRoles(string r_strUserID, string r_strPassword)

        {

            string[] strRoles = null;

            if ((r_strUserID.Equals("Steve")) && (r_strPassword.Equals("15seconds")))

            {

                strRoles = new String[1];

                strRoles[0] = "Administrator";

            }

            else if ((r_strUserID.Equals("Mansoor")) && (r_strPassword.Equals("mas")))

            {

                strRoles = new string[1];

                strRoles[0] = "User";

            }

            return strRoles;

        }

    }

}

  编辑Web.config文件:   

  <system.web>   

  <httpModules>   

          <add   name="Custom"   type="MyModules.CustomModule,Custom"/>   

  httpModules>   

  system.web>  

  Custom.aspx页面内容:   

     

  <script   language="c#"   runat="server">   

  public   void   page_load(Object   obj,EventArgs   e)   

  {   

    lblMessage.Text   =   "

Hi,   "   +   User.Identity.Name   +   "

";   

    if(User.IsInRole("Administrator"))   

          lblRole.Text="

You   are   an   Administrator

";   

    else   if(User.IsInRole("User"))   

          lblRole.Text   =   "

You   are   a   normal   user

";   

  }   

  script>   

  <form   runat="server">   

  <asp:Label   id="lblMessage"   forecolor="red"   font-size="10pt"   runat="server"/>   

  <asp:Label   id="lblRole"   forecolor="red"   font-size="10pt"   runat="server"/>   

  form>

  

或者使用后者:

using System;

using System.Web;

namespace MyModule

{

    public class MyModule : IHttpModule

    {

        public void Init(HttpApplication application)

        {

            application.AcquireRequestState += (new

            EventHandler(this.Application_AcquireRequestState));

        }

        private void Application_AcquireRequestState(Object source, EventArgs e)

        {

            HttpApplication Application = (HttpApplication)source;

            User user = Application.Context.Sesseion["User"];  //获取User

            string url = Application.Context.Request.Path;

            //获取客户访问的页面

            Module module = xx; //根据url得到所在的模块

            if (!RightChecker.HasRight(user, module))

                Application.Context.Server.Transfer("ErrorPage.aspx");

            //如果没有权限,引导到错误处理的页面

        }

        public void Dispose()

        {

        }

    }

}

  

插入