2013-03-28 86 views
0

我有一个用户在表单身份验证票证更新且旧表单过期后被踢出问题。 第一票,我得到当我签的是:表单身份验证Cookie替换

票:A094D6F0401A5B6D97688198B09F17B03D209 ............ 结束:星期四,2013年3月28日8时56分33秒GMT

而且经过一段时间后,机票更新,我得到这个cookie:(曲奇到期时,机票到期,所以没有问题)

Ticket:215373E662852AD0CC540AC27F547787 ............. Ends :星期四,2013年3月28日08:58:17 GMT

此票由一个javascript reloader在b用户的背景。现在,如果我更新了页面,我会被踢出去,为什么? 当我再次我用这个票:

 var Id = (FormsIdentity)HttpContext.Current.User.Identity; 
     var Ticket = Id.Ticket; 

     var NewAuthTicket = FormsAuthentication.RenewTicketIfOld(Ticket); 

     HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(NewAuthTicket), new[] {""}); 

     if (NewAuthTicket != null && NewAuthTicket.Expiration > Ticket.Expiration) 
     { 
      // Create the (encrypted) cookie. 
      var ObjCookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
              FormsAuthentication.Encrypt(NewAuthTicket)) 
           { 
            HttpOnly = true, 
            Expires = NewAuthTicket.Expiration, 
            Secure = FormsAuthentication.RequireSSL 
           }; 
      // Add the cookie to the list for outbound response. 
      HttpContext.Current.Response.Cookies.Add(ObjCookie); 
      Ticket = NewAuthTicket; 
     } 

有没有什么解决的呢?

UPDATE:

当我设置cookie的第一次我用这个:

VAR ExpiryDate =与rememberMe!? DateTime.Now.AddMinutes(cookieTimeoutHour):DateTime.Now.AddYears(1);

   //create a new forms auth ticket 
       var Ticket = new FormsAuthenticationTicket(2, ui.UserNr.ToString(CultureInfo.InvariantCulture), DateTime.Now, ExpiryDate, true, String.Empty); 
       //encrypt the ticket 
       var EncryptedTicket = FormsAuthentication.Encrypt(Ticket); 
       //create a new authentication cookie - and set its expiration date 
       var AuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncryptedTicket) 
               { 
                Expires = Ticket.Expiration, 
                HttpOnly = true, 
                Secure = FormsAuthentication.RequireSSL 
               }; 


       Current.Response.Cookies.Add(AuthenticationCookie); 

回答

0

为什么要所有这些努力,当一个简单的保活客户端页面将保持窗体身份验证Cookie还活着吗?

jQuery的例子:

$(function() { 
    window.setInterval(keepalive, 600000); // run keepalive every 10 mins 
}); 

function keepalive() 
{ 
    $.get({url:'/myemptykeepalivepage.aspx',cache:false}); 
} 

当客户端关闭浏览器,间隔功能被取消,瞧,窗体AUTH票自然会到期。

+0

我尝试过。我在web.config中使用了slidingExpiration =“true”,并且没有使用上面的代码,但是更新了票证,但不是cookie的过期时间。当cookie过期时,用户被踢出。当我使用我的代码时,票证超时和cookie timout被扩展,但用户仍然被踢出。为什么? – mrcode 2013-03-28 09:33:29

+0

使用上面的代码(把它放在一个脚本文件中,它是从站点中每个页面的head标签引用的)。该代码与slidingExpiration =“true”相结合将解决您的问题(当然,您必须检查上面的代码是否比表单票证的超时更频繁地运行) – Nathan 2013-03-28 09:36:28

+0

(以上所有代码都确保用户至少每10分钟打一次网页服务器,从而迫使表格票保持'活着') – Nathan 2013-03-28 09:37:35