Cookie 過期或會話超時過早
我有這樣的程式碼,當使用者被授權時執行:
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( 1, email, DateTime.Now, DateTime.Now.AddMinutes(120), true, userData); string encTicket = FormsAuthentication.Encrypt(authTicket); HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); faCookie.Expires = authTicket.Expiration; Response.Cookies.Add(faCookie);然後我重定向到具有授權屬性的控制器/操作:
[Authorize] public class ProductsController : Controller {我在 web.config 中有以下內容:
<authentication mode="Forms"> <forms loginUrl="~/Home/Unauthorized" timeout="2880" /> </authentication> <sessionState timeout="120"></sessionState>但是,使用者在幾分鐘不活動後抱怨會話超時或重定向 Home/Unauthorized。
這可能是什麼原因造成的,我還應該檢查什麼?
在我討論為什麼您的登錄名過期的可能解決方案之前,有幾個想法。首先,FormsAuthentication cookie 和 SessionState 是完全不同的兩個東西。你可以有一個或另一個,或者兩者都有,或者兩者都沒有。結果,這兩個項目的超時時間也沒有關係。
FormsAuthentication cookie 是一個加密的 cookie,其中包含一些基本資訊,例如使用者名和過期值。一旦使用者通過身份驗證,.NET 應用程序就會使用此 cookie 來了解使用者是否被授權使用某些資源。
控制 FormsAuthentication cookie 加密和解密的是 IIS 上該 Web 應用程序的MachineKey。MachineKey 是一組用於加密和解密 cookie 的密鑰。預設情況下,IIS 上的 Web 應用程序設置為自動生成機器密鑰。這意味著當應用程序啟動時,會生成一個隨機機器密鑰。如果應用程序回收,您將獲得一個新的機器密鑰。此外,如果您在共享提供商上託管,則 Web 主機通常會使您的應用程序負載平衡,這意味著由多個伺服器託管。這些伺服器中的每一個都將自動生成一個機器密鑰。
如果您的 Web 應用程序處於負載平衡方案中,則 Web 場中的每台機器都無法解密對方的加密 cookie。這將給出“被註銷”的外觀。這方面的範例是在 Web 伺服器 A 上登錄,然後一個後續請求轉到 Web 伺服器 B。Web 伺服器 B 不與 Web 伺服器 A 共享機器密鑰,並且無法解密 cookie,從而將使用者發送回登錄頁面。
解決方案是在 web.config 中定義 MachineKey 部分,以便 IIS 的每個實例將使用相同的密鑰,並且如果應用程序池回收,您仍然擁有相同的機器密鑰。
以下是您可以放置在 web.config 中的範例機器密鑰(使用 .NET 2.0 版本)
<system.web> <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" validation="SHA1" decryption="AES" /> </system.web>其他想法是您在 web.config (2880) 中的到期時間與您實際設置的到期時間 (120) 不匹配。您可能希望它們都匹配。