2011-05-18 127 views
4

我正在使用Forms身份驗證構建ASP.NET MVC3應用程序,並且想在用戶登錄時註銷用戶的所有現有會話。試圖阻止不同工作站上的多人登錄並在同一帳戶下工作。使用Forms身份驗證在ASP.NET MVC3中註銷用戶的其他會話

有沒有處理這個問題的標準方法?註銷現有會話很簡單,但我還沒有遇到過使用同一個帳戶檢查其他會話並將其註銷的方法。

我對如何破解這個問題有一些想法,但我很好奇,如果有一種使用IIS或FormsAuthentication API的建立方法。

回答

5

,因爲Web,你不能「註銷」會話,直到他們使他們的下一個請求的無國籍狀態(例如,會話可能會保持在一個cookie,它不能在寫客戶端在請求 - 響應交互的上下文之外)。

仍然有一個解決方案,它假定您正在使用會話狀態,最好是所有需要「身份驗證」的控制器都有一個通用基礎控制器。

成功登錄後,生成一個令牌(也許是一個guid)並將其存儲到會話中。還要將其寫入由用戶標識鍵控的應用程序範圍內的存儲(例如數據庫或應用程序上下文)。

在基本控制器中(或者您必須創建一個操作篩選器),檢查會話中的令牌與在應用程序範圍內的商店中爲用戶ID註冊的令牌。如果它們不匹配,請使用標準SignOut()呼叫註銷用戶。

+0

這很好。我傾向於這個方向,但確認是很好的。 – Thomas 2011-05-19 13:12:01

0

你可以使用它是基於LastActivityDateMembership.IsOnline屬性:

用戶在線認爲如果 當前日期和時間減去 UserIsOnlineTimeWindow屬性值 早於LastActivityDate 用戶。

+0

這可以幫助識別用戶是否在線,但我還沒有找到註銷其他會話的API。 – Thomas 2011-05-18 16:58:52

+0

@Thomas,你爲什麼要退出其他會話?如果您想允許一次會話,只需告知用戶在登錄之前關閉其他會話。 – 2011-05-18 17:03:21

+0

問題在於防止用戶讓其他人使用他/她的登錄名。我想減輕多人在一個帳戶下工作的風險。 – Thomas 2011-05-18 17:21:57