會話超時在 IIS 7 中如何工作?
在 web.config 中,我將 sessionState 中的超時設置為 20 分鐘。根據 MSDN,此超時指定會話在被放棄之前可以空閒的分鐘數。在 IIS 7 中,DefaultWebSite->Session State->Cookie Settings->Time Out 自動填充了 web.config 中設置的超時值,在我的例子中是 20 分鐘。另外,Application Pools->DefaultAppPool->Advanced Settings->idleTimeout,我設置為 10 分鐘。
然後我做了兩個測試: 第一個測試:我在下午 3:45 登錄我的 web 應用程序,空閒了 10 分鐘。下午 3 點 55 分,我嘗試使用我的應用程序,但被踢了出去。我認為 idleTimeout 發揮作用。
第二次測試:我在下午 4:00 登錄我的網路應用程序,在下午 4:05、下午 4:10、下午 4:15 和下午 4:20 使用該應用程序。我預計會在下午 4 點 20 分被踢出去。但我不是。我認為 IIS 7 中的會話狀態超時(20 分鐘)是 Web 代理要求使用者重新進行身份驗證之前使用者會話可以處於活動狀態的最長時間。顯然從這個測試,它不是。誰能給我解釋一下?另外,我怎樣才能為上述情況設置超時?
會話超時是一種滑動超時,使用者每次訪問伺服器時都會將其重置為配置的值。
如果在這段時間內沒有對您的應用程序的請求,則應用程序空閒超時啟動。
因此,通常的情況是:
時間 使用者 A 使用者 B 會話狀態 12:00訪問頁面1 A:新會話,超時:20 分鐘 12:02訪問頁面2 A:超時重置:20分鐘 12:10訪問頁面1 A:超時:12分鐘;B:新:20分鐘 12:15訪問頁面2 A:超時:07分鐘;B:超時:20分鐘 12:22A:超時;B:還剩 13 分鐘 12:32應用程序關閉(達到空閒時間) 12:35訪問頁面3 A: 新會話開始 如果使用者 A 在 12:22 之後返回站點,他們將有一個全新的會話,並且您之前儲存在其中的任何值都將失去。
確保會話在應用程序重新啟動時持續存在的唯一方法是配置 SessionState 服務或 SQL 會話狀態,並確保您已配置 machine.key以便在每次伺服器重新啟動時都不會自動生成。
如果您使用標準的 ASP.NET 機制進行身份驗證,那麼 ASP.NET 將向每個使用者發出兩個 cookie:
- Authentication Token:由 Authentication timeout 設置控制,如果 cookie 沒有過期,允許使用者自動登錄到您的站點,這可以是固定的或滑動的,預設為 30 分鐘,這意味著他們的身份驗證令牌可以應對比他們的會話更長的“空閒”時間。
- 會話令牌:由會話超時設置控制,允許您的應用程序在訪問期間儲存和訪問每個使用者的值。
這兩個 cookie 都使用 MachineKey 加密 - 因此,如果您的應用程序回收並生成新密鑰,則這些令牌都無法解密,需要使用者登錄並創建新會話。
回複評論:
- 20 分鐘會話超時與您使用該方法放置在使用者會話對象 ( HttpSessionState ) 中的項目有關
Session.Add(string, object)。- 那要看。如果您已正確配置 machine.key,身份驗證令牌仍然有效,並且如果您的會話不再是“InProc”,這些令牌也將在應用程序重新啟動後持續存在並且仍然可讀 - 請參閱上面的註釋。