源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

asp.net Forms身份验证和基于角色的权限访问

  • 时间:2022-02-18 17:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:asp.net Forms身份验证和基于角色的权限访问
主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。 具体步骤:     1、创建一个网站,结构如下:         网站根目录             Admin目录            ---->    管理员目录                 Manager.aspx        ---->    管理员可以访问的页面             Users目录            ---->    注册用户目录                 Welcome.aspx        ---->    注册用户可以访问的页面             Error目录            ---->    错误提示目录                 AccessError.htm        ---->    访问错误的提示页面             default.aspx            ---->    网站默认页面             login.aspx            ---->    网站登录页面             web.config            ---->    网站配置文件     2、配置web.config如下:
[u]复制代码[/u] 代码如下:
        <configuration>             <system.web>                 <!--设置Forms身份验证-->                 <authentication mode="Forms">                     <forms loginUrl="Login.aspx" name="MyWebApp.APSXAUTH" path="/" protection="All" timeout="30"/>                 </authentication>                 <authorization>                     <allow users="*"/>                 </authorization>             </system.web>         </configuration>         <!--设置Admin目录的访问权限-->         <location path="Admin">             <system.web>                 <authorization>                     <allow roles="Admin"/>                     <deny users="?"/>                 </authorization>             </system.web>         </location>         <!--设置Users目录的访问权限-->         <location path="Users">             <system.web>                 <authorization>                     <allow roles="User"/>                     <deny users="?"/>                 </authorization>             </system.web>         </location>
    3、在login.aspx页面的登录部分代码如下:
[u]复制代码[/u] 代码如下:
        protected void btnLogin_Click(object sender, EventArgs e)         {                 //Forms身份验证初始化             FormsAuthentication.Initialize();             //验证用户输入并得到登录用户,txtName是用户名称,txtPassword是登录密码             UserModel um = ValidUser(txtName.Text.Trim(),txtPassword.Text.Trim());             if (um != null)             {              //创建身份验证票据              FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,                                             um.Name,                                             DateTime.Now,                                             DateTime.Now.AddMinutes(30),                                             true,                                             um.Roles,//用户所属的角色字符串                                             FormsAuthentication.FormsCookiePath);              //加密身份验证票据              string hash = FormsAuthentication.Encrypt(ticket);              //创建要发送到客户端的cookie              HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);              if (ticket.IsPersistent)              {                 cookie.Expires = ticket.Expiration;              }              //把准备好的cookie加入到响应流中              Response.Cookies.Add(cookie);              //转发到请求的页面              Response.Redirect(FormsAuthentication.GetRedirectUrl(um.Name,false));             }             else             {              ClientScriptManager csm = this.Page.ClientScript;              csm.RegisterStartupScript(this.GetType(), "error_tip", "alert('用户名或密码错误!身份验证失败!');", true);             }         }             //验证用户         private UserModel ValidUser(string name, string password)         {             return new UserService().Validate(name, password);         }
    4、给网站添加处理程序Global.asax,其中通用身份验证代码如下:
[u]复制代码[/u] 代码如下:
        //改造原来的User,给其添加一个用户所属的角色数据         protected void Application_AuthenticateRequest(object sender, EventArgs e)         {             if (HttpContext.Current.User != null )             {                 if (HttpContext.Current.User.Identity.IsAuthenticated)                 {                     if (HttpContext.Current.User.Identity is FormsIdentity)                     {                         FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;                         FormsAuthenticationTicket ticket = id.Ticket;                         string userData = ticket.UserData;                         string[] roles = userData.Split(',');                         //重建HttpContext.Current.User,加入用户拥有的角色数组                         HttpContext.Current.User = new GenericPrincipal(id, roles);                     }                 }             }         }
    5、在Admin目录中Manager.aspx页面加载代码如下:
[u]复制代码[/u] 代码如下:
        protected void Page_Load(object sender, EventArgs e)         {             //判断通过身份验证的用户是否有权限访问本页面             FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;             //判断通过身份验证的用户是否是Admin角色             if (!id.Ticket.UserData.Contains("Admin"))             {                 //跳转到访问权限不够的错误提示页面                 Response.Redirect("~/Error/AccessError.htm", true);             }         }         //安全退出按钮的代码         protected void btnExit_Click(object sender, EventArgs e)         {             //注销票据             FormsAuthentication.SignOut();             ClientScriptManager csm = this.Page.ClientScript;             csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已经安全退出了!');", true);         }
    6、在Users目录中Welcome.aspx页面加载代码如下:
[u]复制代码[/u] 代码如下:
        protected void Page_Load(object sender, EventArgs e)         {             //判断通过身份验证的用户是否有权限访问本页面             FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;             //判断通过身份验证的用户是否是User角色             if (!id.Ticket.UserData.Contains("User"))             {                 //跳转到访问权限不够的错误提示页面                 Response.Redirect("~/Error/AccessError.htm", true);             }         }         //安全退出按钮的代码         protected void btnExit_Click(object sender, EventArgs e)         {             //注销票据             FormsAuthentication.SignOut();             ClientScriptManager csm = this.Page.ClientScript;             csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已经安全退出了!');", true);         }
测试结果:     数据:         假设有3个用户,如下:         ------------------------------------------         用户名        密码        角色字符串         ------------------------------------------         sa        sa        Admin,User         admin        admin        Admin         user        user        User         ------------------------------------------     测试:         如果使用admin登录,只能访问Admin目录的Manager.aspx页面;         如果使用user登录,只能访问Users目录的Welcome.aspx页面;         使用sa登录,既能访问Admin目录的Manager.aspx页面,又能访问Users目录的Welcome.aspx页面。     注意:测试时注意及时点击安全退出按钮,否则影响测试结果。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部