通过AuthCookie中的唯一ID将用户限制为一个登录会话,并检查数据库表

时间:2013-07-09 00:57:38

标签: c# asp.net asp.net-mvc-4 forms-authentication

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

我在想:

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

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

  • 如果有一个请求进入,AuthCookie持有的UniqueSessionID与数据库中的那个匹配,或者相应用户缺少记录,则会话无效并将浏览器重定向到登录页面或杀死会话并为Ajax请求发出错误。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

When the same user ID is trying to log in on multiple devices, how do I kill the session on the other device?