如何同步表單身份驗證 cookie 和 Asp.Net 會話的生命週期?
我正在建構一個 ASP.NET 網站,該網站使用
FormsAuthentication標準會話機制,其配置如下:<authentication mode="Forms"> <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/> </authentication> ... <sessionState timeout="20" cookieless="UseCookies" />似乎身份驗證cookie的生命週期不等於使用者會話的生命週期。所以 ASP.NET 不保證
- 使用者註銷時會話終止,
- 會話在使用者註銷之前不會終止。
有沒有辦法自定義
FormsAuthentication或\和會話狀態機制來達到這些目標?
沒有內置機制,因為現實情況是您希望使用者保持登錄的時間比您希望保持他們的會話時間更長。此外,會話並不意味著保證儲存,您應該避免對會話中的數據的任何依賴。
當身份驗證 cookie 過期時,伺服器上不會發生任何事情。沒有跟踪狀態。
您可以有一個“註銷”連結,並且在處理程序
Abandon中的會話和SignOut來自 FormsAuthentication,但沒有什麼可以強制使用者從網站註銷。有些人喜歡 Session,但大多數人討厭或討厭它,因為它的使用被濫用了。主要原因是 Session 過度使用往往是伺服器性能不佳的原因,而不正確的 Session 使用可能會創建無法擴展的網站。
如果可以,請避免使用 Session,如果必須使用它,請遵守 MSDN 文章提高 ASP.NET 性能中的建議。還可以查看了解會話狀態模式 + 常見問題解答,特別是問:為什麼沒有 Session_End 被解僱?
我多次聽到這個問題,我的回答通常是“你為什麼要這個?”。一個不需要另一個,它們的到期時間應該使用不同的標準來確定。
會話狀態不需要使用者登錄。應用程序甚至不需要使用身份驗證來使用會話狀態。您可以擁有一個 Web 應用程序,其中使用者甚至在登錄之前就已經在使用會話狀態,並且在註銷後仍然使用它。這裡的“會話”是指客戶端(Web 瀏覽器)連接到站點,跳過幾頁然後離開。使用者是否登錄無關緊要。如果您關閉瀏覽器,打開一個新瀏覽器,然後返回該站點,則會創建一個新會話。但是伺服器不知道您關閉了舊瀏覽器視窗,因此原始會話仍然存在。出於可擴展性(主要是記憶體)的目的,我們使會話過期並釋放其記憶體和會話跟踪資源。如果客戶端發出新請求的時間過長,則新請求將創建一個新會話。
另一方面,您可以使用身份驗證而不使用會話狀態。我通常在禁用會話狀態和視圖狀態的情況下啟動我的應用程序,並且僅在真正需要時並逐頁啟用它們(或視圖狀態的逐個控制)。
會話過期時間應由每個會話使用的記憶體、Web 伺服器上的可用記憶體、並髮使用者數和其他可伸縮性需求決定。它通常在幾分鐘到一個小時的範圍內。
身份驗證作為 cookie 保存在客戶端,基本上不消耗伺服器的任何資源。可擴展性方面,登錄過期通常比會話過期長。事實上,使用者可以無限期地保持登錄狀態。當身份驗證過期時間保持較短時,通常是出於安全原因。如果您離開電腦 15 分鐘,您不希望其他人可以使用您的銀行網站帳戶,對嗎?您可以登錄 gmail 或 facebook 並選擇“記住我”並在幾天后返回,您仍然處於登錄狀態。但這當然是一個新會話,因為任何網路應用程序都不應該保留會話數據幾天。
現在,我看到很多人使用相同的時間長度進行身份驗證和會話到期。當使用者註銷時,許多人還會 Abandon() 或 Clear() 他們的會話。但是他們忘記了您仍然需要管理使用者仍然登錄但會話已過期(這會在下一個請求中創建一個新的空會話)的情況,或者當使用者的身份驗證過期但他們的會話沒有過期(需要他們再次登錄,但攜帶舊的未過期會話,可能帶有另一個使用者的敏感數據)。無論您最終為應用程序選擇什麼超時,處理這些情況都非常重要。