学习froms验证(三)

8 篇文章 0 订阅
1 篇文章 0 订阅

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);

现在改为

string userDataString =”你要写入的内容”;
 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对象的一个实例

 

void Application_OnPostAuthenticateRequest(object sender, EventArgs e)   
 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;
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类是

 

1using System;
 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值