在登录与认证的实现中,FormsAuthenticationTicket和FormsAuthentication是二个核心的类型,前者可以认为是一个数据结构,后者可认为是处理前者的工具类。
UrlAuthorizationModule是一个授权检查模块,其实它与登录认证的关系较为独立,因此,如果我们不使用这种基于用户名与用户组的授权检查,也可以禁用这个模块。
由于Cookie本身有过期的特点,然而为了安全,FormsAuthenticationTicket也支持过期策略,不过,ASP.NET的默认设置支持FormsAuthenticationTicket的可调过期行为,即:slidingExpiration=true 。这二者任何一个过期时,都将导致登录状态无效。
FormsAuthenticationTicket的可调过期的主要判断逻辑由FormsAuthentication.RenewTicketIfOld方法实现,代码如下: 498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/5/11151246337.png" />
- public static FormsAuthenticationTicket RenewTicketIfOld(FormsAuthenticationTicket tOld)
- {
- // 这段代码是意思是:当指定的超时时间逝去大半时将更新FormsAuthenticationTicket对象。
- if( tOld == null )
- return null;
- DateTime now = DateTime.Now;
- TimeSpan span = (TimeSpan)(now - tOld.IssueDate);
- TimeSpan span2 = (TimeSpan)(tOld.Expiration - now);
- if( span2 > span )
- return tOld;
- return new FormsAuthenticationTicket(tOld.Version, tOld.Name,
- now, now + (tOld.Expiration - tOld.IssueDate),
- tOld.IsPersistent, tOld.UserData, tOld.CookiePath);
- }
Request.IsAuthenticated可以告诉我们当前请求是否已经过身份验证,我们来看一下这个属性是如何实现的:
- public bool IsAuthenticated
- {
- get
- {
- return (((this._context.User != null)
- && (this._context.User.Identity != null))
- && this._context.User.Identity.IsAuthenticated);
- }
- }
从代码可以看出,它的返回结果基本上来源于对Context.User的判断。
另外,由于User和Identity都是二个接口类型的属性,因此,不同的实现方式对返回值也有影响。
由于可能会经常使用HttpContext.User这个实例属性,为了让它能正常使用, DefaultAuthenticationModule会在ASP.NET管线的PostAuthenticateRequest事件中检查此属性是否为null,如果它为null,DefaultAu