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);
现在改为
2
3//创建一个HttpCookie对象
4HttpCookie authCookie = FormsAuthentication.GetAuthCookie(UserName.Text, RememberMe.Checked);
5
6// 解密authCookie从而得到FormsAuthenticationTicket
7FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
8//创建一个新的 FormsAuthenticationTicket并加入userData
9FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userDataString);
10//进行加密
11authCookie.Value = FormsAuthentication.Encrypt(newTicket);
12//写入到客户端的Cookies中去
13Response.Cookies.Add(authCookie);
14//得到一次跳转钱的url
15string redirUrl = FormsAuthentication.GetRedirectUrl(UserName.Text, RememberMe.Checked);
16Response.Redirect(redirUrl);
注意以上代码信息相关存储是基于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对象的一个实例
2 {
3 //得到当前验证的用户
4 IPrincipal usr = HttpContext.Current.User;
5
6 //通过了验证并且验证机制要是Froms
7 if (usr.Identity.IsAuthenticated && usr.Identity.AuthenticationType == "Forms")
8 {
9 FormsIdentity fIdent = usr.Identity as FormsIdentity;
10
11 //创建 CustomIdentity 对象
12 CustomIdentity ci = new CustomIdentity(fIdent.Ticket);
13
14 // 创建 CustomPrincipal 对象
15 CustomPrincipal p = new CustomPrincipal(ci);
16
17 // 当当前用户改为 CustomPrincipal
18 HttpContext.Current.User = p;
19 Thread.CurrentPrincipal = p;
20 }
21
对应的CustomIdenttity代码为
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Security;
/// <summary>
///CustomIdentity 的摘要说明
/// </summary>
public class CustomIdentity : System.Security.Principal.IIdentity
{
private FormsAuthenticationTicket _ticked;
public CustomIdentity(FormsAuthenticationTicket ticket)
{
_ticket = ticket;
}
#region IIdentity 成员
public string AuthenticationType
{
get { return "Custom"; }
}
public bool IsAuthenticated
{
get { return true; }
}
public string Name
{
get { return _ticket.Name; }
}
public string CompanyName
{
get
{
string[] userDataPieces = _ticket.UserData.Split("|".ToCharArray());
return userDataPieces[0];
}
}
public string Title
{
get
{
string[] userDataPieces = _ticket.UserData.Split("|".ToCharArray());
return userDataPieces[1];
}
}
#endregion
}
对应的CustomPrincipal类是
2using System.Data;
3using System.Configuration;
4using System.Linq;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.HtmlControls;
9using System.Web.UI.WebControls;
10using System.Web.UI.WebControls.WebParts;
11using System.Xml.Linq;
12using System.Security;
13
14/// <summary>
15///CustomPrincipal 的摘要说明
16/// </summary>
17public class CustomPrincipal : System.Security.Principal.IPrincipal
18{
19 private CustomIdentity _identity;
20
21 public CustomPrincipal(CustomIdentity identity)
22 {
23 _identity = identity;
24 }
25
26 #region IPrincipal 成员
27
28 public System.Security.Principal.IIdentity Identity
29 {
30 get { return _identity; }
31 }
32
33 public bool IsInRole(string role)
34 {
35 return false;
36 }
37
38
39 #endregion
40}
http://www.cnblogs.com/couhujia/archive/2009/10/27/1590660.html