0

我正在创建一个允许用户运行测试和托管学习内容的网站,我不希望任何登录用户能够拥有多个逻辑会话。因此,通过使来自任何非当前/最新会话的任何请求无效,基本上限制了登录到同一帐户的多个浏览器或计算机的同时使用。但是我不太确定如何最好地使用 asp.net 表单身份验证来解决这个问题。

我在想:

  • 创建一个名为 ActiveSessions 的数据库表,其中包含以下行:UserID、UniqueSessionID。将此 UniqueSessionID 存储在客户端上的加密 AuthCookie 中。

  • 如果用户未通过身份验证并通过标准登录页面 /account/login 等登录。创建新的 UniqueSessionID 并将其分别存储在 AuthCookie 和 ActiveSessions 表中,覆盖任何现有值。我想我必须解密并复制将发出的默认 AuthCookie 表单的内容,然后使用此复制的数据创建一个新的 AuthCookie,并将我的 UniqueSessionID 插入其中,然后再将其返回给客户端。

  • 如果收到请求,其中 AuthCookie 持有的 UniqueSessionID 与数据库中的唯一会话ID 不匹配,或者相应用户的记录丢失,则使会话无效并将浏览器重定向到登录页面或终止会话并发出错误Ajax 请求。

  • 创建某种预定服务,根据用户 LastActivityDate 超过某个时间长度的位置等来清理 ActiveSessions 表中的记录。

理想情况下,我希望表单身份验证提供一些钩子,我可以在其中粘贴此逻辑,并避免使用控制器/方法等的属性来执行此操作。

我还希望完全避免使用会话状态及其 cookie。

4

1 回答 1

0

我有一个非常相似的要求。我的情况是,我必须确保一次只从一台设备登录用户 ID(顺便说一下,表单身份验证,而不是 AD)。当用户 ID 尝试登录另一台设备但仍登录现有设备时,它会终止其现有设备上的会话,同时允许他们登录新设备。我创建的实现运行良好,到目前为止,在设计中没有发现任何缺陷。我在 Stack Overflow 上的原始帖子中写了一个解决方案:

当同一个用户 ID 尝试在多台设备上登录时,如何终止另一台设备上的会话?

于 2013-08-19T20:31:28.930 回答