2009-10-26 58 views
0

我希望在我的應用程序上具有功能,可以讓用戶檢查他們希望無限期保持記錄(任意設置NOW從3個月後的Cookie過期)。表單身份驗證cookie似乎停止工作

我處理這個代碼是

private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse, 
                 bool persistCookie) 
{    
    var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie); 

    if (persistCookie) 
     cookie.Expires = DateTime.Now.AddMonths(3); 

    return cookie; 
} 

private void LoginUser(string userNameResponse, bool PersistCookie) 
{ 
    Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie)); 

    string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse, 
                   PersistCookie); 

    Response.Redirect(navigateAfterUrl); 
} 

但是在某些時候後,當我回到我需要再次登錄該網站。我已經驗證了cookie返回了我的過期日期,並且它沒有被設置爲會話cookie(也通過關閉/重新打開瀏覽器進行測試,並且cookie仍然存在)。我的一個想法是,當ASP.NET到期會話時,它有什麼關係。

我在我的web.config中有一個特定的機器鍵設置,所以不應該相同的cookie工作,如果IIS重新啓動等?有沒有人有什麼建議可以導致這個問題或至少如何進一步追蹤這個問題,因爲我想不出別的辦法。

回答

1

當您調用GetAuthCookie方法時,FormsAuthenticationTicket是由web.config中的Timeout屬性給出的超時值創建的。所以一定要正確設置它:

<authentication mode="Forms"> 
    <forms 
    loginUrl="/someloginUrl" 
    requireSSL="true" 
    protection="All" 
    // This is the setting you are looking for! (it's in seconds) 
    timeout="120" 
    domain="example.com" 
    slidingExpiration="false" 
    name="cookieName" /> 
</authentication> 

一旦票據被加密它被用作該cookie的值。當您將Cookie的Expires屬性設置爲給定值時,這表示它將在給定時間段內保留在客戶端計算機上。然後,在每個請求上,ASP.NET運行時將檢查cookie的存在,將嘗試解密該值並獲取票證。接下來,它將通過使用Timeout屬性來檢查票證是否仍然有效,所以如果您有一個小超時,無論您的Cookie是否仍然傳輸,票證不再有效,並且驗證將失敗。

+0

那麼,如果我將超時設置爲3 * 30 * 24 * 60,那麼什麼是折衷?沒有選擇保持登錄狀態的用戶永遠不會離開我們的網站,直到他們關閉瀏覽器並刪除會話cookie爲止。 – 2009-10-26 20:12:52

+0

即使用戶關閉瀏覽器,如果您設置了一個持久cookie(Expires屬性),那麼他將不會被註銷。但是如果你調用'FormsAuthentication.SignOut'方法,cookie將會失效。 – 2009-10-26 20:16:55

+0

我指的是一個用戶選擇不保持登錄,該cookie沒有設置爲持久性的。 – 2009-10-26 20:21:50