防止ASP .Net中单个用户多次登录

4
我正在研究如何防止单个用户在Webforms应用程序中多次登录。我知道MembershipUser.IsOnline存在,但我读了一些论坛和博客文章,这些文章表明它可能不可靠,特别是在用户关闭浏览器(未注销)并尝试使用其他机器或浏览器登录的情况下。
我考虑实施一个“先到先得”类型的系统;当用户登录时,旧用户将被简单地踢出。似乎FormsAuthentication.Signout()仅适用于当前用户。
我是否遗漏了什么技巧?有没有更好的方法来防止相同用户名从多个不同位置登录?
2个回答

4

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

当用户尝试登录时,首先检查其凭据是否有效。如果有效,则检查该用户的缓存值是否存在。如果存在,则知道已有人使用这些凭据登录。然后,我允许用户取消或注销其他用户。如果他们点击“注销其他用户”,则缓存值将更改为新值,并且原始用户将在下一次上述AJAX回调时被重定向到登录页面。总体而言,它运行得很好,我们的用户没有任何抱怨。

关于这种技术的几个注意事项:

  1. 您不能像上面建议的那样使用SessionID,因为它根据您的设置每次调用会话变量时都会更改。我们在第一次尝试使其工作时就遇到了这个问题。

  2. 您可以让两个用户同时登录Y分钟,然后将其中一个用户踢出,所以请明智地选择时间。

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

2
基本问题在于Web是无状态的——一旦服务器将所需内容发送到浏览器,客户端和服务器上的应用程序之间的连接就会断开,直到下一次请求。现在,我们能够通过各种手段创建状态的幻象,以便我们可以在会话期间将用户标识为已登录,但实际上这意味着当向服务器发出请求时,我们测试提供的信息,然后“决定”用户是否(仍然)已登录。
这意味着您在强制注销要求方面的机制受到限制——用户可能会忘记关闭浏览器或转移到其他内容,或者浏览器可能会崩溃,他们的会话可能会超时(因为长时间的电话),网络连接可能会中断等等,但您将拥有的唯一知识是来自客户端的请求缺失,并没有积极表明发生了或没有发生的事情。
这导致的结果是,“最好”的解决方案—至少目前我所知道的—是跟踪与登录相关联的会话,以便在进行请求并且您正在决定该用户是否已登录时,将当前请求的会话ID与上次登录过程开始时的会话ID进行比较,如果它们不同,则采取适当的措施,即注销当前用户并强制他们重新登录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接