2013-03-28 178 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