我不得不認爲使用asp.net會話,特別是使用forms-auth會很可怕 - 因爲用戶得到2個cookie:會話和授權。想象一下,如果通過身份驗證的用戶A會從經過身份驗證的用戶B竊取會話cookie,會發生什麼情況:它會導致用戶A有權訪問用戶B擁有的所有數據(除非您的代碼檢查auth-cookie中的用戶ID是否擁有會話對象,換句話說,我建議擺脫會話,或者至少爲會話對象添加用戶標識值,並確保從auth-cookie中檢查用戶標識與application_authorize事件中的用戶標識匹配,也許。沒有要求這個信息,但我認爲這是適當的,無論如何。
由於會話和身份驗證cookie相互之間沒有多大關係,就瀏覽器而言,您的目標是保持會話活着,而auth-cookie應該過期,然後,你也許可以通過編寫一段JS(提示:window.setInterval
)來解決這個問題,它定期ping一些匿名url(aspx頁面)在您的服務器上(確保您爲這些請求添加一個隨機查詢;例如new Date().getTime()
)。 anon aspx頁面需要從會話中讀取(不要寫入!)一些值(或者簡單地檢索會話對象) - 只是爲了保持活動狀態(也許這不是真的必要;請嘗試),但瀏覽器會發送asp.net會話cookie與這些請求,所以你可以保持會議對象這樣永遠活着。
另一方面,您的auth-cookie將會過期。然而,你必須設置web.config設置(認證>表單),以便不使用滑動到期(因爲該模式本質上將auth cookie的有效性/到期延長爲另一個無論超時是幾分鐘)。然後,您可以確定,在cookie過期後(例如20分鐘後),當用戶點擊受保護的鏈接(以及鏈接到受保護頁面的鏈接;非匿名頁面)時,他們將登錄登錄頁。我知道你不想要這個。因此,要解決這個問題,請添加另一個(獨立的)javascript(提示:window.setTimeout([code], 2 * 60 * 1000) // to fire after 2 min since the page-load
)以啓動登錄對話框。登錄對話框會通過發佈uid/pwd並讓asp.net驗證它來擴展auth-cookie。另一件事:如果你在頁面上有一個Ajax,你必須考慮將這些js超時重置回0(或者取消然後重新初始化間隔和超時事件)。換句話說,你不能從頁面加載開始測量不活動 - 你必須重置每個用戶動作(單擊或至少在每個Ajax回調)上的不活動計數器。
我在這裏暗示的可能是一個矯枉過正的問題。我可能會嘗試解決這個問題。我會嘗試從圖片中刪除進程內會話,並根據auth-cookie的用戶標識從每個用戶數據每次需要時(或每個請求一次)重新加載它。我不知道爲什麼把會話對象掛在內存中是非常重要的,即使用戶已經註銷了(你怎麼知道他們不會離開一個星期;如果你有會話,那麼保持會話活動會導致你的服務器死機大量的用戶)。也許將會話數據存儲在數據庫或網絡上的其他緩存機制(例如memcached)中,並在每個請求(例如application_authorize)中檢索一次,並將其存儲在request.context中(以免多次從多個位置檢索它)。然後,您的auth-cookie將過期,並且在驗證cookie過期前幾分鐘使用JS彈出登錄對話框(以避免用戶點擊鏈接時用戶登錄頁面出現空隙,如果您關心的話甚至)。
我希望這些想法有所幫助。