C# ASP.NET:如何防止同时打开同一个站点几次?

C# ASP.NET:如何防止同时打开同一个站点几次?,c#,.net,session,multiple-instances,C#,.net,Session,Multiple Instances,我是ASP的新手,遇到了最糟糕的开发者噩梦:我收到了一个巨大的ASP.NET项目,我必须对它做一些修改。更改之一是防止在一次Active Directory登录时多次打开同一站点(不同的选项卡、浏览器等) 正如我注意到的,应用程序正在使用会话。使用会话阻止同一站点的多个实例有何想法?您只需要从每个页面创建一个持久连接。若浏览器在单个选项卡上从一个页面导航到另一个页面,那个么您将始终拥有一个单一的持久连接。如果从同一用户获得两个并行持久连接,则该用户打开了一个新选项卡 在母版页页脚中添加一个脚本,

我是ASP的新手,遇到了最糟糕的开发者噩梦:我收到了一个巨大的ASP.NET项目,我必须对它做一些修改。更改之一是防止在一次Active Directory登录时多次打开同一站点(不同的选项卡、浏览器等)
正如我注意到的,应用程序正在使用会话。使用会话阻止同一站点的多个实例有何想法?

您只需要从每个页面创建一个持久连接。若浏览器在单个选项卡上从一个页面导航到另一个页面,那个么您将始终拥有一个单一的持久连接。如果从同一用户获得两个并行持久连接,则该用户打开了一个新选项卡

在母版页页脚中添加一个脚本,该脚本在没有结束响应的页面上对服务器执行ajax调用(如长轮询)。如果在连接最后一个ajax调用时,另一个ajax调用来自同一个用户,那么这是第二个选项卡


您可能希望签出持久连接。它应该能够根据浏览器功能在web套接字或长轮询之间切换。

您不能阻止url一次加载到多个浏览器或选项卡中,因为这是一个由客户端启动的过程


您可以实现持久连接(如Hasan Khan所建议的),以确保一次只能激活一个浏览器窗口。我想补充一点,当一个新窗口打开时,你可以警告用户他们已经有一个打开的连接。如果他们选择使用新连接,则您会向旧连接(不同的浏览器、选项卡等)发送一条消息,使其为该用户清除浏览器窗口。

以下是一个想法。使用GUID为的隐藏字段,该字段将由服务器为每个页面加载随机生成。当一个请求到达服务器时,它会检查GUID是否是上次生成的。如果它不同或为空(会话处于活动状态时)-重定向到某个页面,说明访问被拒绝(此处没有新的GUID)。如果正确,请提供所需页面。这样做的一个小问题是,如果有人关闭浏览器并重新打开它,他/她在再次尝试使用您的应用程序时将被拒绝访问。为了最小化这一点,您需要将会话超时时间降低到1分钟,并使用ajaxasp:Timer保持会话活动。请记住将保持活动调用(以及任何其他AJAX调用)排除在GUID生成/验证管道之外。当然,会话结束会重置进程。此外,鼓励用户正确地注销也是一件好事

这是一个相对简单的解决方案,尽管它的保护级别比永久连接弱。不过,对于非技术性的最终用户来说,这已经足够了——这取决于你的“受众”。但即使是对了解该机制的人来说,使用两个应用程序“实例”也会非常困难


如果你真的需要的话就去做。一般来说,我同意Marc的观点,网络应用不应该受到这样的限制。也许这是一个受过教育的人的要求?

呃。。。。你为什么要破坏互联网的工作方式?不要试图阻止用户使用多个浏览器会话。修复你的应用程序!出于安全原因需要它,不幸的是:/“出于安全原因”。。。听起来安全部门的做法是错误的。不要生成失败。您可以阻止单个用户拥有多个会话,但不能阻止单个会话在多个选项卡或浏览器窗口中使用。