上面几个小节主要介绍了利用web.config基于用户名的身份验证,在实际开发过程中,还经常遇到另外一种情况,例如:网站的后台管理页面只能够被允许管理员角色的用户才能访问,其他角色不能够访问。我们可以借助于<authentication>配置节,按照如下方式进行配置,现用<allow>配置节允许角色Admins管理员,在使用<deny>配置节拒绝所有用户,那么可以达到只允许管理员访问的目的。 完成基于角色的身份验证,大致可以分三个部分: 1. web.config部分,用户设置身份验证和权限控制。 2. ASP.NET部分,用户添加身份验证票证。 3. Global.asax部分,设置身份验证请求事件。
代码演示: 基于角色的身份验证web.config部分 - <configuration>
- <system.web>
- <authentication mode="Forms">
- <forms name="myForm" loginUrl="UserLogin.aspx" timeout="10" defaultUrl="Main.aspx">
- </forms>
- </authentication>
- <authorization>
- <allow roles="Admins">
- <deny users="?">
- </authorization>
- </system.web>
- </configuration>
复制代码在C#代码中,添加身份验证票证的时候,将用户的角色信息添加到票证中,与<authorization>结合从而实现目标。 参考代码如下: 代码演示: 基于角色的身份验证ASP.NET部分 - protected void btnLogin_Click(object sender, EventArgs e)
- {
- string loginname = this.txtLoginName.Text;
- string loginpwd = this.txtLoginPwd.Text;
- if (loginname == "张三" && loginpwd == "123456")
- {
- //为了演示,将角色定义到变量中
- string role = "Admins";
- //创建票证对象
- FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
- 1, loginname, DateTime.Now, DateTime.Now.AddMinutes(30), true, role);
- //对票证对象加密措施
- string hashticket = FormsAuthentication.Encrypt(ticket);
- //将票证添加到Cookie中
- HttpCookie usercookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashticket);
- Response.Cookies.Add(usercookie);
- //将页面重定向到指定URL
- Response.Redirect(FormsAuthentication.GetRedirectUrl(loginname,true));
- }
- }
复制代码代码演示: 基于角色的身份验证Global.asax部分 - <%@ Application Language="C#" %>
- <script runat="server">
- protected void Application_AuthenticateRequest(Object sender, EventArgs e)
- {
- HttpApplication app = (HttpApplication)sender;
- //获取本次Http请求的HttpContext对象
- HttpContext ctx = app.Context;
- if (ctx.User != null)
- {
- //验证过的一般用户才能进行角色验证
- if (ctx.Request.IsAuthenticated == true)
- {
- //获得身份验证用户的标识
- System.Web.Security.FormsIdentity fi =
- (System.Web.Security.FormsIdentity)ctx.User.Identity;
- //取得身份验证票
- System.Web.Security.FormsAuthenticationTicket ticket = fi.Ticket;
- //从UserData中恢复role信息
- string userData = ticket.UserData;
- //将角色数据转成字符串数组,得到相关的角色信息
- string[] roles = userData.Split(',');
- //这样当前用户就拥有角色信息了
- ctx.User = new System.Security.Principal.GenericPrincipal(fi, roles);
- }
- }
- }
- </script>
复制代码在上面代码中,通过Global.asax文件访问到HttpApplication的安全模块建立事件,通过身份验证用户的标识,获得身份验证的票证,并在票证中加入用户角色相关信息,结合web.config和ASP.NET达到基于角色身份验证的目的。
|