2013-06-19 36 views
2

我們在我們的ASP.Net MVC3網站中啓用了無Cookie身份驗證和會話。我們遇到的問題是,如果您註銷用戶,則不會使存儲在無Cookie的字符串中的已創建Cookie /會話無效。該場景如下:ASP.Net Cookieless:如何刪除身份驗證Cookie

用戶登錄到站點,使用無cookie身份驗證進行註冊和登錄;用戶現在在他們的url中擁有無cookie的票證。用戶通過創建桌面快捷方式複製並粘貼url。

用戶從站點註銷並調用FormAuthentication.SignOut()以使該票證失效並被重定向到登錄頁面。

用戶現在可以簡單地將該URL複製並粘貼到任何瀏覽器中,甚至可以轉到另一臺計算機,即使它們已經註銷,該網站也會接受該認證憑單;造成嚴重的安全風險。

有沒有什麼方法可以禁用所有以前的cookie,無論是否cookieless?目前,我們的流程適用於基於cookie的會話/登錄;我們只需要一個無cookie的解決方案。

我們目前發現的唯一可能的解決方案是跟蹤數據庫中的所有cookie,並使數據庫中的cookie無效以及檢查數據庫以確保當前cookie仍然有效。這會對性能產生重大影響,所以我們希望在向前邁進之前驗證這是唯一的/最佳的解決方案。

感謝

回答

2

基本上/ F-長文/存儲您的FormAuthentication票的URL。這張票內自動過期(至少如果它不持久),在該時間段後,該URL變得無效。所以我會建議簡單地減少時間跨度。如果顯式註銷是「必須擁有的」,那麼只有當您在webfarm中時才需要使用db,並且您沒有某種擴展解決方案。如果你有單獨的盒子,你可以使用HttpCache來做這個骯髒的工作。此外,我會只使用UserID,而不是整個cookie(即在登錄時添加用戶ID有一些時間跨度到活動用戶ID範圍內,在Global.asax上PostAuthorize檢查用戶是否在活動用戶ids,延長他的時間跨度,如果他是和扔他否則,在註銷時刪除他)。

+0

非常感謝你;對於延遲迴答抱歉。它有點忙。我喜歡你的HttpCache解決方案;將用於當前版本。我們將來會把它移到一個網絡農場,那麼我們要麼將它移動到數據庫,要麼使用跨越農場的分佈式緩存。 – Gustyn

0

使用Session.Abandon()的SignOut後丟棄會話

+0

我已經嘗試過這種解決方案;不幸的是,我們發現,即使你殺了會話,如果它在晚些時候出現,URL中編碼的cookie仍然很有用。但感謝您的答案。 – Gustyn

+0

會話狀態與表單身份驗證無關。 –