簡體   English   中英

如何同步表單身份驗證cookie和Asp.Net Session的生命周期?

[英]How to synchronize lifetime of forms authentication cookie and Asp.Net Session?

我正在構建一個ASP.NET網站,它使用FormsAuthentication和標准的Session機制,配置如下:

<authentication mode="Forms">
    <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/>
</authentication>
...
<sessionState timeout="20" cookieless="UseCookies" />

似乎身份驗證cookie的生命周期不等於用戶Session的生命周期。 所以ASP.NET並不能保證這一點

  1. 用戶注銷時會話終止,

  2. 在用戶注銷之前,會話不會終止。

有沒有辦法自定義FormsAuthentication或\\和會話狀態機制來實現這些目標?

我多次聽過這個問題,我的回答通常是“你為什么要這個?”。 一個不需要另一個,它們的到期時間應該使用不同的標准來確定。

會話狀態不需要用戶登錄。應用程序甚至不需要使用身份驗證來使用會話狀態。 即使在登錄之前,您也可以擁有一個用戶已經在使用會話狀態的Web應用程序,並且在注銷后仍然可以使用它。 這里的“會話”是指客戶端(Web瀏覽器)連接到站點,跳轉幾頁並離開。 用戶是否登錄是無關緊要的。 如果您關閉瀏覽器,打開一個新瀏覽器,然后返回該站點,則會創建一個新會話。 但服務器不知道您關閉了舊瀏覽器窗口,因此原始會話仍然存在。 對於可伸縮性(主要是內存)目的,我們使會話到期並釋放其內存和會話跟蹤資源。 如果客戶端花費太長時間來發出新請求,則新請求將創建新會話。

另一方面,您可以使用身份驗證,而不是使用會話狀態。 我通常啟動我的應用程序,會話狀態和視圖狀態都被禁用,只有在真正需要時才會啟用它們,並且逐頁(或視頻狀態控制)。

會話到期時間應由每個會話使用的內存,Web服務器上可用的內存,並發用戶數和其他可伸縮性需求確定。 通常在幾分鍾到一小時的范圍內。

身份驗證在客戶端上作為cookie持久存在,並且基本上不會消耗服務器的任何資源。 可伸縮性方面,登錄到期通常可以比會話到期時間長。 實際上,用戶可以無限期地保持登錄狀態。 當身份驗證過期時間縮短時,通常是出於安全原因。 如果您離開計算機15分鍾,您不希望您的銀行網站帳戶可供其他人使用,對嗎? 您可以登錄gmail或Facebook並選擇“記住我”並在幾天后返回並且您仍然登錄。但當然這將是一個新會話,因為沒有Web應用程序應該保留會話數據幾天。

現在,我看到很多人使用相同的時間進行身份驗證和會話過期。 當用戶注銷時,許多人還會放棄他們的會話。 但是他們忘記了你仍然需要管理用戶仍然登錄但會話已經過期的情況(在下一個請求中創建一個新的會話),或者當用戶的身份驗證過期而不是他們的會話時(需要它們)再次登錄,但攜帶一個舊的未過期會話,可能與另一個用戶的敏感數據) 無論您最終為您的申請選擇何種超時,處理這些案件都非常重要。

沒有內置機制,因為現實是您希望讓用戶登錄的時間超過您希望保持其會話的時間。 此外,會話並不意味着保證存儲,您應該避免依賴會話中的數據。

當身份驗證cookie過期時,服務器上什么都不會發生。 沒有跟蹤狀態。

你可以有一個“注銷”鏈接,並在處理程序中Abandon會話和來自FormsAuthentication的SignOut ,但沒有任何東西迫使用戶從網站注銷。

有些人喜歡Session,但是大多數人討厭或者討厭它,因為它的使用被濫用了。 主要原因是會話過度使用往往是服務器性能低下的原因,不正確的會話使用可能會創建無法擴展的網站。

如果可以,請避免使用Session,如果必須使用它,請遵守MSDN文章“ 改進ASP.NET性能”中的建議。 另請參閱了解會話狀態模式+常見問題解答 ,特別是問:為什么沒有解雇Session_End?

我有時問自己這個問題的原因是為了防止訪問“過期的”會話對象。 當會話在登錄到期之前到期,並且用戶請求使用來自會話的數據的頁面時,會發生討厭的空引用異常。

您可能會發現本文很有幫助。 它討論了幾種檢測過期會話的解決方案,並告知用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM