单实例登录实现

时间:2010-03-04 06:50:34

标签: c# asp.net

我在项目中遇到了一个严重的问题(在ASP.NET 2.0中构建的Web应用程序),如下所述。

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

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

  1. 单击(X)关闭
  2. 关闭浏览器
  3. 会话超时
  4. 错误
  5. 但是由于网络故障,电源故障或任何此类原因,用户会以某种方式突然注销。我无法更新数据库中的标志,这是用户无法使用相同的用户ID登录的原因,除非我们手动更新该标志。

    上述实施的原因:

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

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

    提前致谢。

3 个答案:

答案 0 :(得分:2)

浏览器本质上是断开连接的系统(所有意图和目的)。在用户的浏览器会话结束时,您无法依赖获取任何通知(来自客户端)。

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

IMO,如果您有“单一会话”要求,更好的方法是“最后的胜利” - 即如果您登录第二个会话,您会破坏第一个会话(基本上打破他们的令牌) - 所以首先< / em>会话已注销。这是 easy 要做的事情(在数据库中,只需在登录时更改guid或增加计数器(针对特定用户))。如果需要,您可以将第二个会话的IP(或其他)记录到您正在进行的会话中,但如果第二个会话可以将自己认证为“singh_nirajan”,那么在大多数常见场景中这应该足够了

答案 1 :(得分:0)

保存登录标志时,请设置lastlogindatetime字段。

在登录方法中,具有同时查看位和日期时间戳的逻辑,以确定这是否是从未正确关闭的旧会话。

答案 2 :(得分:0)

这里的诀窍是确定通信来自同一台机器。在Windows应用程序中,您将工作站名称传递给数据库。允许来自同一工作站的两个登录请求;来自不同工作站的两个人将被拒绝。但是,在网络上没有简单的方法可以做到这一点。如果您的公司不使用DHCP或每个人都有IP预留,您可以尝试使用IP。如果在WinForms中执行应用程序不是一个选项,那么您可以尝试使用一个小型的一次性应用程序将工作站名称传递给数据库。在过去,人们会通过强制IE和使用ActiveX控件在Intranet应用程序上解决此问题。幸运的是,我们已经超越了它,但确实解决了这类问题。