通过AuthCookie中的唯一ID将用户限制为一个登录会话,并对照数据库表进行检查
本文关键字:会话 登录 一个 进行检查 数据库 唯一 ID AuthCookie 用户 通过 | 更新日期: 2023-09-27 18:21:39
我正在创建一个网站,让用户运行测试并托管研究内容,我不希望任何登录的用户能够拥有多个逻辑会话。因此,通过使来自任何非当前/最新会话的任何请求无效,基本上限制了登录到同一帐户的多个浏览器或计算机的同时使用。但我不太确定如何最好地使用asp.net表单身份验证。
我在想:
-
创建一个名为ActiveSessions的数据库表,其中包含行:UserID、UniqueSessionID。将此UniqueSessionID存储在客户端的加密AuthCookie中。
-
如果用户未通过身份验证并通过标准登录页/帐户/登录等登录,则创建新的UniqueSessionID并将其分别存储在AuthCookie和ActiveSessions表中,覆盖任何现有值。我想我必须解密并复制身份验证将发布的默认AuthCookie表单的内容,然后使用复制的数据创建一个新的AuthCookie,并在将其返回给客户端之前将我的UniqueSessionID插入其中。
-
如果收到一个请求,而AuthCookie持有的UniqueSessionID与数据库中的不匹配,或者相应用户的记录丢失,请使会话无效,并将浏览器重定向到登录页或终止会话,并为Ajax请求发出错误。
-
创建某种定时服务,根据用户LastActivityDate超过某个时间长度等情况清理ActiveSessions表中的记录。
理想情况下,我希望表单身份验证提供一些钩子,我可以在其中坚持这种逻辑,并避免使用控制器/方法等的属性。
此外,我希望避免完全使用会话状态及其cookie。
我有一个非常相似的需求。我的情况是,我必须确保每次只从一个设备登录用户ID(顺便说一句,表单身份验证,而不是AD)。当用户ID试图在登录现有设备的同时登录另一个设备时,它会终止其现有设备上的会话,同时允许他们登录到新设备。我创建的实现非常完美,到目前为止,没有发现设计中的任何缺陷。我在我关于Stack Overflow的原始帖子上写了一个解决方案:
当同一个用户ID试图在多个设备上登录时,如何终止另一个设备上的会话?