我已经为客户使用表单身份验证构建了一个ASP.Net MVC站点 最近,他们要求将经过身份验证的用户限制为单个浏览器会话。也就是说,如果用户引发新的浏览器实例,或者在原始浏览器窗口上打开新选项卡,则他/她将从原始文件中注销。他们坚持增加安全性。 有谁知道我怎么会接近这个?提前谢谢。
答案 0 :(得分:5)
就个人而言,我会回过头来确切地询问这带来的安全性。像这样的网络架构维护状态,只会给你和你的用户带来悲伤。
答案 1 :(得分:3)
如果出现此问题,我会采取以下措施:
答案 2 :(得分:1)
首先是免责声明:我不是网络编程方面的专家。
也许您可能会尝试一个系统,其中每个用户交互都需要提交为该页面生成的随机值(非常类似于用于CSRF保护的内容。)该密钥可以保存在用户的会话信息下在服务器上,如果在没有正确密钥作为URL参数的情况下请求页面,则会话无效。来自一个浏览器的URL也不会在另一个浏览器中工作,因为一旦访问了URL,用户的会话密钥就会发生变化。用户在标签之间转移会话的唯一方法是复制未链接链接的URL并将其粘贴到新标签的地址栏中。假设ASP.Net使用会话cookie,切换浏览器将更加复杂:用户必须将cookie从一个浏览器转移到另一个浏览器。返回也会失败,因为上一页上的所有链接以及页面的URL都会带有错误的会话密钥。
另外,作为参考,我相信美国政府TreasuryDirect网站的工作方式与您所描述的方式相同,但我从未考虑过如何管理它。
答案 3 :(得分:1)
谢谢,人们的建议。每个都有很大的优点,但我必须采取混合方法。我从this post找到了一个非常简单的建议。
我实现了Karl建议的活跃用户表。这将使客户端能够按需停用用户。 再次感谢。
答案 4 :(得分:0)
将其视为一次一个活动视图,而不是一个浏览器或标签。或者说服客户以这种方式查看。
您始终可以为浏览器会话(ASP.NET会话)发布一个唯一的cookie,并允许与有效发布的最新cookie进行通信,一次只激活一个会话,从而呈现其他打开的会话(浏览器,选项卡等) )不再使用应用程序,不再允许他们进行通信或为他们提供错误页面。为此,您必须识别用户是谁并根据您的应用对其进行身份验证。这只是一半的难题,将迫使用户在他们的机器上一次只在一个浏览器中使用您的应用程序。
问题的另一部分是削减属于该浏览器的相同浏览会话的窗口和标签,以便一次只允许一个视图处于活动状态。为此,您可以向每个页面的视图状态发出唯一的顺序ID,以便回发到服务器,以便除了共享相同会话状态的其他页面之外唯一地标识该页面(无论该页面是在浏览器选项卡,框架还是新窗口中)等)。或者您可以追溯的代码。然后,您可以知道哪个页面在会话中回发,并且可以通过以某种方式关闭通信或提供错误页面等来禁止其他页面或停用以前的页面。
新浏览器实例或新选项卡可能是也可能不是同一浏览会话的一部分,具体取决于浏览器的配置方式。我相信,例如,IE提供了一个设置,允许设置是否在新进程或会话中打开选项卡或共享会话的行为。您不一定会在浏览器之间获得预期的一致性来依赖此功能,因此您需要采取编程步骤来控制它,如上所述。
您可以执行其他步骤,例如禁止用户同时从其他IP#连接。