使用Forms身份验证在ASP.NET MVC3中注销用户的其他会话

使用Forms身份验证在ASP.NET MVC3中注销用户的其他会话

问题描述:

我正在使用Forms身份验证构建ASP.NET MVC3应用程序,并且想在用户登录时注销用户的所有现有会话。试图阻止不同工作站上的多人登录并在同一帐户下工作。使用Forms身份验证在ASP.NET MVC3中注销用户的其他会话

有没有处理这个问题的标准方法?注销现有会话很简单,但我还没有遇到过使用同一个帐户检查其他会话并将其注销的方法。

我对如何破解这个问题有一些想法,但我很好奇,如果有一种使用IIS或FormsAuthentication API的建立方法。

,因为Web,你不能“注销”会话,直到他们使他们的下一个请求的无国籍状态(例如,会话可能会保持在一个cookie,它不能在写客户端在请求 - 响应交互的上下文之外)。

仍然有一个解决方案,它假定您正在使用会话状态,最好是所有需要“身份验证”的控制器都有一个通用基础控制器。

成功登录后,生成一个令牌(也许是一个guid)并将其存储到会话中。还要将其写入由用户标识键控的应用程序范围内的存储(例如数据库或应用程序上下文)。

在基本控制器中(或者您必须创建一个操作筛选器),检查会话中的令牌与在应用程序范围内的商店中为用户ID注册的令牌。如果它们不匹配,请使用标准SignOut()呼叫注销用户。

+0

这很好。我倾向于这个方向,但确认是很好的。 – Thomas 2011-05-19 13:12:01

你可以使用它是基于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