5

我已经为客户端使用表单身份验证构建了一个 ASP.Net MVC 站点。
最近,他们要求将经过身份验证的用户限制在单个浏览器会话中。也就是说,如果用户提出一个新的浏览器实例,或者在原来的浏览器窗口上打开一个新的选项卡,他/她就会从原来的浏览器窗口中注销。他们坚持增加安全性。有谁知道我会如何处理这个问题?提前致谢。

4

5 回答 5

5

就个人而言,我会反击并询问这会带来什么安全性。维护这样的状态与 Web 架构背道而驰,只会给您和您的用户带来痛苦。

于 2013-09-19T02:39:48.743 回答
3

如果遇到这个问题,我会这样做:

  1. 将用户的用户名存储在您的数据库中(即 LoggedOn 表)。
  2. 当用户登录时,检查他们的用户名是否已经存在于 LoggedOn 表中。
  3. 如果用户尚未登录,请在表中插入一行,其中包含用户名和当前时间;否则向用户显示一条消息,通知他们一次只能从一台设备登录系统。
  4. 如果用户的会话过期或用户注销,则包括使表中的行过期和删除的逻辑。
于 2013-09-19T01:25:21.690 回答
1

首先声明:我不是网络编程专家。

也许您可以尝试一个系统,其中每个用户交互都需要提交为该页面生成的随机值(很像用于CSRF保护。)该密钥可以保存在服务器上用户的会话信息下,如果在没有正确密钥作为 URL 参数的情况下请求页面,则会话无效。来自一个浏览器的 URL 在另一个浏览器中也不起作用,因为一旦一个 URL 被访问,用户的会话密钥就改变了。用户在选项卡之间传输会话的唯一方法是复制未点击链接的 URL 并将其粘贴到新选项卡的地址栏中。假设 ASP.Net 使用会话 cookie,切换浏览器会更加复杂:用户必须将 cookie 从一个浏览器传输到另一个浏览器。返回也会失败,因为前一页上的所有链接以及该页的 URL 都会携带不正确的会话密钥。

另外,作为参考,我相信 US Gov't TreasuryDirect网站按照您描述的方式运作,尽管我从未看过他们如何管理它。

于 2013-09-19T01:33:50.763 回答
1

谢谢大家的建议。每个都有很强的优点,但是我不得不采取混合方法。我从这篇文章中找到了一个非常简单的建议。

我也按照 Karl 的建议实现了活跃用户表。这将使客户端能够按需停用用户。再次感谢。

于 2013-09-25T01:05:20.460 回答
0

将其视为一次一个活动视图,而不是一个浏览器或选项卡。或者说服客户以这种方式看待它。

您始终可以为浏览器会话(ASP.NET 会话)发出唯一的 cookie,并允许与有效发出的最新 cookie 进行通信,从而使一次只有一个会话处于活动状态,从而使其他打开的会话(浏览器、选项卡等)无用该应用程序不再允许他们通信或为他们提供错误页面。为此,您必须识别用户是谁并对您的应用程序进行身份验证。这是难题的一半,它将迫使用户在他们的机器上一次只能在一个浏览器中使用您的应用程序。

问题的另一部分是削减属于该浏览器的同一浏览会话的窗口和选项卡,以便一次只允许一个视图处于活动状态。为此,您可以向每个页面的视图状态发出唯一的顺序 ID,以便回发到服务器,以唯一地标识该页面与共享相同会话状态的其他页面(无论该页面位于浏览器选项卡、框架还是新窗口中) , ETC)。或者您选择的可追溯代码。然后,您知道哪个页面在会话中发回,并且可以通过再次以某种方式关闭通信或提供错误页面等来禁止其他页面或停用以前的页面。

取决于浏览器的配置方式,新浏览器实例或新选项卡可能属于或不属于同一浏览会话。我相信,例如,IE 提供了一个设置,允许设置选项卡是在新进程或会话中打开还是共享会话的行为。您不一定会获得跨浏览器的预期一致性来依赖此功能,因此您需要采取编程步骤来控制它,就像上面描述的那样。

您可以执行其他步骤,例如禁止用户同时从不同的 IP# 连接。

于 2013-09-19T01:23:55.857 回答