防止在ASP .Net中为单个用户进行多次登录

时间:2010-01-26 09:33:23

标签: asp.net webforms

我正在研究如何最好地阻止单个用户帐户在webforms应用程序中多次登录。我知道MembershipUser.IsOnline存在,但我读过一些论坛和博客条目,表明这可能不可靠,特别是在用户关闭浏览器(没有注销)并尝试使用其他机器登录的情况下或浏览器。

我着眼于实施最后一个帖子类型系统;用户登录旧用户时,只需启动即可。似乎FormsAuthentication.Signout()仅适用于当前用户。

我错过了一个技巧,是否有更好的方法可以阻止从多个不同位置登录相同的用户名?

2 个答案:

答案 0 :(得分:4)

我最近遇到了同样的问题,这就是我解决它的方法。我将一个值放入缓存中,在X分钟后过期。在我的代码中,我每Y分钟都有一次AJAX回调(y

当用户尝试登录时,首先检查是否有凭据有效。如果它们是它然后去检查以查看该用户的缓存值是否存在。如果是,我知道有人使用这些凭据登录。然后我允许用户取消或记录其他用户。如果他们单击“记录另一个用户”,则缓存值将更改为新值,并且下次他们具有上述AJAX回调时,原始用户将重定向到登录页面。总的来说,它非常有效,没有我们用户的抱怨。

关于这种技术的几点说明:

  1. 您不能将SessionID用作 以上建议因为它改变了 每次会话变量 根据您的设置调用。我们 我们首先遇到了这张脸 首先尝试使这项工作。

  2. 您可以登录两个用户     在一个人被启动前Y分钟     所以明智地选择你的时间。

  3. 如果用户尝试在缓存之前登录     到期(比如关闭后)     窗口)他们会收到消息     另一个用户已登录。
  4. 设置缓存值时,不能仅使用数字,因为它们与某些内部ASP.NET内容冲突。确保在值的开头添加一个键。

答案 1 :(得分:2)

基本问题是网络在概念上是无状态的 - 一旦服务器将所需内容发送到浏览器,客户端与服务器上的应用程序之间的连接就会停止,直到下一个请求为止。现在我们可以通过各种方式创建状态错觉,以便我们可以在会话期间识别用户登录但实际上意味着当向服务器发出请求时我们测试信息我们提供,然后决定用户是否(仍)登录。

这意味着您在执行注销要求的机制方面受到限制 - 用户可能忘记并关闭浏览器或继续浏览其他内容或浏览器可能会死亡,他们的会话可能会超时(因为一个长时间的电话,网络连接可能会死,等等,但你唯一的知识就是来自客户的请求的绝对,而不是积极的迹象表明事情已经发生或没有发生过。

这样做的结果是“最好” - 据我所知 - 您可以实现的是跟踪与登录相关联的会话,以便在发出请求并且您正在决定时无论该用户是否已登录,您将当前请求的会话ID与上次在会话开始时登录过程发生的会话ID进行比较,如果它们不同,则采取适当的操作,即退出当前用户并强制他们再次登录