ASP.NET Forms验证,下面看一下授权的详细过程:
1). 一旦一个用户访问这个网站,就行登录确认了身份,身份验证票的cookie也写到了客户端。之后,这个用户再次申请这个web的页面,身份验证票的cookie就会发送到服务端。在服务端,ASP.NET为每一个http请求都分配一个HttpApplication对象来处理这个请求,在 HttpApplication.AuthenticateRequest事件后,安全模块已建立用户标识,就是此用户的身份在web端已经建立起来,这个身份完全是由客户端发送回来的身份验证票的cookie建立的。
2). 用户身份在HttpContext.User 属性中,在页面中可以通过Page.Context 来获取同这个页面相关的HttpContext对象。对于Forms验证,HttpContext.User属性是一个GenericPrincipal类型的对象,GenericPrincipal只有一个公开的属性Identity,有个私有的m_role属性,是string[]类型,存放此用户是属于哪些role的数组,还有一个公开的方法IsInRole(string role),来判断此用户是否属于某个角色。
由于身份验证票的cookie中根本没有提供role属性,就是说Forms身份验证票没有提供此用户的role信息,所以,对于Forms验证,在服务端得到的GenericPrincipal 用户对象的m_role属性永远是空的。
3). GenericPrincipal. Identity 属性是一个FormsIdentity类型的对象,这个对象有个Name属性,就是此用户的标示,访问授权就是将此属性做为user来进行授权验证的。 FormsIdentity还有一个属性,就是Ticket属性,此属性是身份验证票FormsAuthenticationTicket类型,就是之前服务器写到客户端的身份验证票。
服务器在获取到身份验证票FormsAuthenticationTicket对象后,查看这个身份验证票是不是非持久的身份验证,是的话要根据web.config中timeout属性设置的有效期来更新这个身份验证票的cookie(为避免危及性能,在经过了超过一半的指定时间后更新该 Cookie。这可能导致精确性上的损失。持久性 Cookie 不超时。)
4). 在HttpApplication.ResolveRequestCache事件之前,ASP.NET开始取得用户请求的页面,建立HttpHandler控制点。这就意味着,在HttpApplication.ResolveRequestCache事件要对用户访问权限就行验证,看此用户或角色是否有权限访问这个页面,之后在这个请求的生命周期内再改变此用户的身份或角色就没有意义了。
以上是ASP.NET Forms验证的全过程,可以看出,这个ASP.NET Forms验证是基于用户的,没有为角色的验证提供直接支持。身份验证票FormsAuthenticationTicket 中的Name属性是用户标示,其实还有一个属性UserData,这个属性可以由应用程序来写入自定义的一些数据,我们可以利用这个字段来存放role的信息,从而达到基于角色验证的目的。
- privatevoidButton1_Click(objectsender,System.EventArgse)
- {
- //实体类AdminUserVO对应AdminUser用户表。
- AdminUserVOadminUserVO=newAdminUserVO();
- adminUserVO.Uname=UserName.Text.Trim();
- adminUserVO.Upwd=UserPwd.Text.Trim();
- adminUserVO.LastIP=HttpContext.Current.Request.UserHostAddress;
- adminUserVO.LastTime=DateTime.Now;
- boolflag=(newLoginDAO()).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("登录失败");
- }
- }
【编辑推荐】