我正在创建一个允许用户运行测试和托管学习内容的网站,我不希望任何登录用户能够拥有多个逻辑会话。因此,通过使来自任何非当前/最新会话的任何请求无效,基本上限制了登录到同一帐户的多个浏览器或计算机的同时使用。但是我不太确定如何最好地使用 asp.net 表单身份验证来解决这个问题。
我在想:
创建一个名为 ActiveSessions 的数据库表,其中包含以下行:UserID、UniqueSessionID。将此 UniqueSessionID 存储在客户端上的加密 AuthCookie 中。
如果用户未通过身份验证并通过标准登录页面 /account/login 等登录。创建新的 UniqueSessionID 并将其分别存储在 AuthCookie 和 ActiveSessions 表中,覆盖任何现有值。我想我必须解密并复制将发出的默认 AuthCookie 表单的内容,然后使用此复制的数据创建一个新的 AuthCookie,并将我的 UniqueSessionID 插入其中,然后再将其返回给客户端。
如果收到请求,其中 AuthCookie 持有的 UniqueSessionID 与数据库中的唯一会话ID 不匹配,或者相应用户的记录丢失,则使会话无效并将浏览器重定向到登录页面或终止会话并发出错误Ajax 请求。
创建某种预定服务,根据用户 LastActivityDate 超过某个时间长度的位置等来清理 ActiveSessions 表中的记录。
理想情况下,我希望表单身份验证提供一些钩子,我可以在其中粘贴此逻辑,并避免使用控制器/方法等的属性来执行此操作。
我还希望完全避免使用会话状态及其 cookie。