asp.net中使用基于角色role的Forms验证,大致经过几下四步: <system.web>
<authentication mode="Forms" > <forms name=".yaoCookies" loginUrl="/duan/Manage/login.aspx" protection="All" timeout="20" path="/" /> </authentication> </system.web> 其中<authentication mode= "forms"> 表示本应用程序采用Forms验证方式。 2). <forms>标签中的loginUrl指定如果没有找到任何有效的身份验证 Cookie,为登录将请求重定向到的 URL。默认值为 default.aspx。loginUrl指定的页面就是用来验证用户身份的,一般此页面提供用户输入用户名和密码,用户提交后由程序来根据自己的需要来验证用户的合法性(大多情况是将用户输入信息同数据库中的用户表进行比较),如果验证用户有效,则生成同此用户对应的身份验证票,写到客户端的Cookie,最后将浏览器重定向到用户初试请求的页面.一般是用FormsAuthentication.RedirectFromLoginPage 方法来完成生成身份验证票,写回客户端,浏览器重定向等一系列的动作. public static void RedirectFromLoginPage( string userName, bool createPersistentCookie, string strCookiePath ); 其中: 这里可以看到,此方法参数只有三个,而身份验证票的属性有七个,不足的四个参数是这么来的: 3). <forms>标签中的timeout和path,是提供了身份验证票写入到Cookie过期时间和默认路径。 以上就是基于Forms身份验证的过程,它完成了对用户身份的确认。 2.在受保护的文件夹如Manage下创建一web.config文件,内容如 <configuration>
<!--指定对整个Manage目录的访问权限--> <system.web> <authorization> <!--多个角色用,分隔--> <allow roles="admin,user"/> <deny users="*" /> </authorization> </system.web> <!--也可控制某个页的权限 <location path="AnnounceList.aspx"> <system.web> <authorization> <allow roles="admin"/> <deny users="*" /> </authorization> </system.web> </location> <location path="ConfigInfo.aspx"> <system.web> <authorization> <allow roles="users"/> <deny users="*" /> </authorization> </system.web> </location> --> </configuration> 注:此配置内容也可以加入到系统的web.config文件中,注意加入位置: ........ <allow>标签表示允许访问,其中的属性 <deny>标签表示不允许访问。其中的属性同上面的。 在运行时,授权模块迭代通过 <allow> 和 <deny> 标记,直到它找到适合特定用户的第一个访问规则。然后,它根据找到的第一项访问规则是 <allow> 还是 <deny> 规则来允许或拒绝对 URL 资源的访问。Machine.config 文件中的默认身份验证规则是 <allow users="*"/>,因此除非另行配置,否则在默认情况下会允许访问。 1). 一旦一个用户访问这个网站,就行登录确认了身份,身份验证票的cookie也写到了客户端。之后,这个用户再次申请这个web的页面,身份验证票的cookie就会发送到服务端。在服务端,asp.net为每一个http请求都分配一个HttpApplication对象来处理这个请求,在HttpApplication.AuthenticateRequest事件后,安全模块已建立用户标识,就是此用户的身份在web端已经建立起来,这个身份完全是由客户端发送回来的身份验证票的cookie建立的。 3.登录页 //登录按钮
private void Button1_Click(object sender, System.EventArgs e) { //实体类AdminUserVO对应AdminUser用户表。 AdminUserVO adminUserVO = new AdminUserVO(); adminUserVO.Uname = UserName.Text.Trim(); adminUserVO.Upwd = UserPwd.Text.Trim(); adminUserVO.LastIP = HttpContext.Current.Request.UserHostAddress; adminUserVO.LastTime = DateTime.Now; bool flag = (new LoginDAO()).Chk(adminUserVO); if (flag) { //非角色验证时可以用这句: //System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text.Trim(),false); //创建角色验证信息,把role信息写入到UserData中 SetLoginCookie(adminUserVO,adminUserVO.Roles.ToLower()); HttpContext.Current.Response.Redirect("Main.aspx"); } else { HttpContext.Current.Response.Write("登录失败"); } }
//SetLoginCookie方法
public static void SetLoginCookie(AdminUserVO u, string roles) { //建立身份验证票对象 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket (1,u.Uname, DateTime.Now, DateTime.Now.AddMinutes(30), false,roles,"/"); //加密序列化验证票为字符串 string hashTicket = FormsAuthentication.Encrypt (ticket) ; HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket); HttpContext.Current.Response.Cookies.Add(userCookie); } FormsAuthenticationTicket参数说明: protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{ HttpApplication app = (HttpApplication) sender; HttpContext ctx = app.Context ; //获取本次Http请求的HttpContext对象 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 ; //取得身份验证票 string userData = ticket.UserData;//从UserData中恢复role信息 string[] roles = userData.Split (',') ; //将角色数据转成字符串数组,得到相关的角色信息 ctx.User = new System.Security.Principal.GenericPrincipal (fi, roles) ; //这样当前用户就拥有角色信息了 } } } 注:如果使用HttpModule的话,此处代码应该加入在AuthenticateRequest事件中 |