froms中timeout值得注意的问题
一般我们不设置这个值是默认的30分钟,也就是说绝对的过期时间为30分钟,当我们希望在每次用户向站点发出请求时,只要票据还没有过期就重新设置过期时间.可以通过slidingExpiration配置选项来实现该行为.如果将它设置为true,每次FormsAuthenticationModule对用户通过认证后,就更新该用户的票据的expiry(相当于有效期).如果设置为false (默认值), 就不对expiry进行更新,后果就是,用户票据一旦过了设置好的绝对过期点,用户就从认证用户变成匿名用户.
例子:
<authentication mode="Forms">
<forms slidingExpiration="true" timeout="60" /> </authentication>
forms authentication system使用何种cookie策略,取决于<forms>元素里的cookieless设置,它可以有如下四种配置:
.UseCookies——指定总是使用基于cookie的票据
.UseUri——指定从不使用基于cookie的票据
(如果是这种方式系统必须对所有页面的URL编码以包含票据数据)
.AutoDetect——如果device profile不支持cookies,就不使用基于cookie的票据;如果device profile支持cookies,那么就运用一种探测机制来判断是否可以使用cookies.
.UseDeviceProfile——这是默认值.如果device profile支持cookies,就使用基于cookie的票据.不运用探测机制.
一般我们设置成UseDeviceProfile,当浏览器支持cookies,就是用基于cookie的票据,如果不支持就对所有页面的URL编码以包含票据数据
例子:
<authentication mode="Forms">
<formscookieless="UseDeviceProfile" slidingExpiration="true" timeout="60"/>
</authentication>
对票据运用何种安全措施取决于<forms>元素里protection的配置.该项的值可为如下几个值之一:
.All——默认值,票据要加密且运用数据有效性验证
.Encryption——只加密,不生成MAC
.None——既不加密也不运用数据有效性验证.
.Validation——生成一个MAC,但不对票据加密,以纯文本的形式传递.
微软强烈推荐使用All配置选项.
(MAC就是一小片信息,用来对需要进行验证的数据(就本文而言,就是票据)实施鉴别.如果数据被改动过,那么MAC就不能与改动过的数据匹配)
学习上面的内容以后我们就可以自己重写用户数据验证,并且进一步加入用户数据
以前用下面一段代码写入用户验证票
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
现在改为
注意以上代码信息相关存储是基于Cookies票据,对于无Cookies票据我们是无法存储用户数据的
以下代码是得到用户数据
FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = ident.Ticket;
string userDataString = ticket.UserData;
ASP.NET接到一个请求后,通过一系列的步骤对请求进行处理.在每一步都会触发一个具体的事件,这就为开发人员楔入ASP.NET处理通道内部,在其生命周期的某一点上对请求进行修改提供了可能.以FormsAuthenticationModule为例,当ASP.NET引发AuthenticateReques事件后,在该事件里它对请求进行认证票据检查,如果在请求里发现了票据,就生成一个GenericPrincipal对象,并赋值给HttpContext.User属性.
在AuthenticateRequest事件之后,ASP.NET又引发PostAuthenticateRequest事件, 在该事件里,我们可以将FormsAuthenticationModule创建的GenericPrincipal对象替换为我们自定义的CustomPrincipal对象的一个实例
对应的CustomIdenttity代码为
}
对应的CustomPrincipal类是