簡體   English   中英

ASP.NET MVC - 在幾分鍾不活動后擦除會話數據

[英]ASP.NET MVC - Erasing session data after fer minutes of inactivity

在我的網絡應用程序中,我經常可以看到,當我幾分鍾沒有做任何事情,然后我回來,刷新頁面 - 我仍在登錄,但我的會話數據全部消失了!

login()操作中,我正在設置幾個Session[]對象,這些對象是頁面正常工作所必需的。 我不知道為什么會這樣做,但我需要它在用戶清除會話數據時將其記錄下來。

我已經讀過關於設置<sessionState mode="InProc" timeout="20"/>但是每次刷新頁面時這個超時會刷新嗎? 或者從我登錄后的20分鍾后它會用完嗎? 如果我讓這個計時器比保持在線用戶更大,該怎么辦?

發回服務器將使會話保持更長時間。 這是一個滑動過期。 有兩種方法可以從客戶端處理,客戶端不知道這20分鍾的超時:

  • 使用客戶端javascript創建計時器,當命中20分鍾時,該計時器會重定向到注銷頁面
  • 每當發生回發時,檢查會話是否過期(可以通過多種方式完成,例如檢查Session.IsNewSession,查看對象是否丟失等),然后在處理請求之前重定向到注銷處理程序。

我假設您正在使用表單身份驗證。 那是對的嗎? 如果是這樣,您需要使您的Forms身份驗證票證的超時與會話超時匹配。

用戶通過比最初看起來更復雜的過程保持登錄狀態。 Cookie存儲在用戶的瀏覽器中,稱為Forms Authentication Ticket。 如果用戶保持空閑超過會話超時限制,則服務器將丟棄該會話。 但是在下一個請求中,表單身份驗證票證將傳遞回Web服務器。 服務器驗證票證,如果它仍然有效,則用戶將重新登錄。

如您所見,用戶的會話未恢復。 如果您需要該行為,則必須檢測該條件並自行恢復會話。

解決方案是將Forms Authentication Ticket的超時設置為與Session超時相同。 您可以在Web.config文件中完成此操作, 如下所述

<system.web>
    <authentication mode="Forms">
          <forms timeout="20"/>
    </authentication>
</system.web>

超時值以分鍾為單位。 一旦達到Forms Authentication Ticket的超時,用戶將被注銷。 這與會話的超時無關,但如果它們相同,則它們將在大致相同的時間到期。 如果您想要完全安全,請將Forms Authentication Ticket超時設置為略短於會話超時。 用戶將在會話超時之前注銷。 當他們再次登錄時,他們將獲得一個新的會話。 舊會議最終會自行完成。

試試這個:

問:在Proc模式下,為什么我偶爾會丟失所有會話?

答:請參閱本文“了解會話狀態模式”部分中的“穩健性”部分。

穩健性

InProc - 如果工作進程(aspnet_wp.exe)循環使用,或者appdomain重新啟動,則會話狀態將丟失。 這是因為會話狀態存儲在appdomain的內存空間中。 重啟可能是由於某些配置文件(如web.config和machine.config)的修改,或者\\ bin目錄中的任何更改(例如使用VS重新編譯應用程序后的新DLL)引起的。有關詳細信息,請參閱KB324772 。 在v1中,還有一個錯誤會導致工作進程重新啟動。 它在SP2和v1.1中修復。 見KB321792。

來源 - http://forums.asp.net/t/7504.aspx/1

暫無
暫無

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

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