2010-02-08 82 views
3

我有一個FormsAuthentication cookie,它是持久的,並且在開發,測試和生產環境中獨立工作。我有一個可以驗證,用戶對象被創建,身份驗證Cookie添加到響應用戶:ASP.Net FormsAuthentication重定向丟失重定向和Application_AuthenticateRequest之間的cookie

'Custom object to grab the TLD from the url 
authCookie.Domain = myTicketModule.GetTopLevelDomain(Request.ServerVariables("HTTP_HOST")) 
FormsAuthentication.SetAuthCookie(authTicket.Name, False) 
Response.SetCookie(authCookie) 

用戶得到處理一點點檢查爲第一次登錄,安全問題等, ,然後用下面的珍聞重定向:

Session.Add("ForceRedirect", "/FirstTimeLogin.aspx") 
Response.Redirect("~/FirstTimeLogin.aspx", True) 

隨着調試中斷,我可以驗證Cookie集合持有兩個不相關的,我爲不同的目的和formsauthentication設置cookie身份驗證的cookie。然後,在這個過程中,下一步在ApplicationAuthenticateRequest發生在Global.asax:

Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) 
    Dim formsCookieName As String = myConfigurationManager.AppSettings("FormsCookieName") 
    Dim authCookie As HttpCookie = Request.Cookies(formsCookieName) 

在這一點上,這一個用戶authCookie是什麼。我有15,000個其他用戶不受這種影響。但是,對於一個用戶來說,曲奇消失得無影無蹤。我之前已經看到過這種情況,其中有w3wp.exe異常,狀態服務器異常和其他與IIS進程相關的異常,但我在事件日誌中沒有發現異常。 w3wp.exe沒有崩潰,狀態服務器有一些超時,但它們似乎不相關(經過時間戳驗證),並且只發生在這一個域上的這一個用戶(該代碼在2個不同的頂級域名和大約10個其他子域中使用) 。

我正在調查的一個途徑是cookie可能太大。我認爲會檢查進入響應的cookie的大小,我不認爲這會影響它。任何想法爲什麼請求可能傾倒cookie?

注意:我提到的我設置的輔助cookie也被甩了(而且它非常小)。

編輯注:發生這種情況時,會話令牌不會丟失。但是,由於身份驗證cookie丟失,因此會在後續登錄時忽略並替換它。

回答

4

事實證明,被轉儲到該特定用戶的Cookie中的Cookie數據恰好超過了加密格式允許的最大大小。未加密的數據是合適的,但一旦運行加密,尺寸變得太大而無法處理。這會導致cookie以及從響應頭中刪除的所有cookie。

切入注入cookie的數據量解決了問題。

+0

什麼是最大Cookie大小? – 2011-09-06 16:04:19

+1

@Elan Hasson:4096字節:http://support.microsoft.com/kb/306070 – 2011-09-06 16:30:11

+0

謝謝 - 我跑了一些測試,以確定長度.. 在這個遺留應用程序中,他們將大部分內容都存儲在cookie中。將所有內容移動到會話中解決了問題:) – 2011-09-15 14:37:47

0

潛在的問題是您重定向的方式;通過將布爾值設置爲true,可以發送ThreadAbortException,並且可能會丟失會話令牌。將布爾值設置爲false或使用FormsAuthentication.RedirectFromLoginPage

+0

不,將布爾值設置爲true會導致ThreadAbordException被忽略。我嘗試使用FormsAuthentication.RedirectFromLoginPage具有相同的效果。值得注意的是,會話令牌不會丟失。它仍然存在。 – 2010-02-08 20:59:08

+0

根據mdsn文檔http://msdn.microsoft.com/en-us/library/a8wa7sdt(VS.80).aspx'endResponse'指示當前頁面的執行是否應該終止,因此將其設置爲false是避免'ThreadAbordException'的方法。這就是說,我恐怕不能真正幫忙。你看過改變過期日期嗎? – Romhein 2010-02-09 21:11:09