2011-12-30 25 views
1

我想保存一些數據到會話狀態。當用戶首次通過表單身份驗證登錄時,我需要保存這些數據。我需要此會話狀態變量具有與表單身份驗證票證過期相同的生命週期。有什麼方法可以確保這兩者保持同步?保存數據到會話狀態,並保持與來自身份驗證同步

+0

只有當你們一直檢查它們時,你才能做到這一點。例如,每次需要讀取會話數據時,檢查是否(SessionData exists && UserIsLogedOn)。 – Aristos 2011-12-30 00:33:14

+0

謝謝。我想要保護的數據是用戶密碼(現有的Web服務,所以我沒有選擇),我認爲會話狀態會更安全,然後在表單身份驗證票證。你不能想到一個更好的地方來存儲它,所以我沒有這些同步問題嗎? – 2011-12-30 00:50:33

+0

會話狀態不安全!會話狀態的cookie可能會被竊取並獲得會話。 – Aristos 2011-12-30 02:51:50

回答

3

有什麼方法可以確保這兩個保持同步嗎?

兩者都在web.config中有一個超時值,您可以設置爲相同的值。現在說這是你的問題可能開始的地方。表單身份驗證Cookie可能會有滑動到期設置,而會話不可用。因此,如果您希望兩個超時值匹配,請確保您禁用身份驗證Cookie的此滑動過期。而這僅僅是一個開始。對於會話,您可以選擇存儲它的位置:Off,InProc,StateServer,SqlServer。

當您使用關閉(我個人使用)ASP.NET會話被禁用,你基本上沒有任何會話。

當您將其設置爲InProc(默認值)時,會話將存儲在內存中。除非IIS可以決定在不同情況下回收AppDomain:一段時間不活動,達到某個CPU /內存閾值,......這基本上意味着如果會話存儲在內存中並且AppDomain由Web服務器卸載,鬆散存儲在此會話中的所有內容,而顯然,身份驗證Cookie仍然有效。

StateServer和SQLServer是兩種不同的進程會話存儲模式,其中信息不再存儲在Web服務器的內存中,並且可以在AppDomain被回收的情況下存活。

所以基本上總結一下,以可靠的方式同步ASP.NET會話生命週期和ASP.NET窗體身份驗證cookie生命週期非常困難。我根本沒有使用ASP.NET會話來解決這個問題。

相關問題