c# – 单实例登录实现

我在我的项目(在ASP.NET 2.0中构建的Web应用程序)中面临严重问题,如下所述.

假设我已经给了用户ID“singh_nirajan”并且用户说“User1”使用此用户ID登录到系统.现在我的要求是每当其他用户说“User User2”尝试使用相同的(singh_nirajan)用户ID登录系统时,它将显示“singh_nirajan已登录”的消息.

为了实现相同,我只是在数据库中更新一个标志.同样,只要用户正确注销,我们就会更新数据库中的标志.我们还处理了几个用户无法正确注销的情况,如下所示.

>单击(X)关闭浏览器关闭
>会话超时
>出错

但是由于网络故障,电源故障或任何此类原因,用户会以某种方式突然注销.我无法更新数据库中的标志,这是用户无法使用相同的用户ID登录的原因,除非我们手动更新该标志.

上述实施原因:

有时用户打开多个浏览器并在不同的浏览器中开始繁重的处理任务,很多时候他们共享他们的用户ID和密码,这有时会引起并发问题.为了限制这一点,我们需要实现单实例登录.

任何人都可以建议我实施上述任何其他方法.

提前致谢.

最佳答案 浏览器本质上是断开连接的系统(所有意图和目的).在用户的浏览器会话结束时,您不能依赖于(从客户端)获取任何通知.

就个人而言(作为用户)我会发现这种单一登录行为很烦人,因为我经常在不同的计算机上使用相同的网站(笔记本电脑与台式机对比家用对比工作对比vm主机对vm客户)或者只是在同一台机器上的多个浏览器(在特别是浏览器兼容性测试),但我接受它可能是一项要求.

IMO,如果您有“单一会话”要求,更好的方法是“最后的胜利” – 即如果您登录第二个会话,您会破坏第一个会话(基本上打破他们的令牌) – 因此第一个会话将被注销.这很容易做到(在数据库中,只需在登录时更改guid或增加计数器(针对特定用户)).如果需要,您可以将第二个会话的IP(或其他)记录到您正在进行的操作中,但如果第二个会话可以将自身认证为“singh_nirajan”,那么在大多数常见情况下这应该足够了.

点赞