4

我有一个 ASP.NET 站点。我想禁止用户从两台计算机上使用相同的登录名登录。如果有人登录并且其他人想使用相同的登录名登录,它应该向他显示该用户已经登录的消息。我没有任何表单身份验证或类似的东西。在“登录”按钮上,我只是连接到数据库并检查用户和密码是否有效。

我认为当用户登录时,我会更新他在数据库中的状态,当其他人尝试登录时,如果该用户已经登录,我会检查数据库,但这不是一个好主意,因为当用户没有不要单击“注销”按钮,它不会更新他在数据库中的状态,即他处于非活动状态。

如果没有表单身份验证和类似的东西,还有其他方法可以做到这一点吗?

4

3 回答 3

1

老实说,让 Microsoft 处理表单身份验证的细节会更容易,但如果我被“挑战”不使用表单身份验证,我会这样做。(还有其他方法,这只是我喜欢的一种)。

  • 在登录时,我会为用户创建会话 cookie(比如 10 分钟),这个 cookie 将包含一个表的 id,我将在其中存储他们的用户 ID、登录时间和他们引用的 ip。我也会在 cookie 中包含这些信息(使用简单的加密),在每次页面加载时,我都会更新 cookie 以持续 10 分钟,并根据数据库检查凭据。这意味着如果用户没有每十分钟访问一次网站,会话就会超时。这还可以让您知道用户何时从另一个位置登录。

旁注:如果您对 Windows 窗体使用自定义身份验证,则几乎所有上述内容都会为您处理。使用 Windows 窗体身份验证意味着您不必担心超时和 cookie 管理。

于 2012-07-31T23:19:32.860 回答
1

没有完美的解决方案

你不能可靠地解决这个问题,但你可以接近。在某些极端情况下,合法用户会对此限制感到沮丧。

你可以做什么

ASP.Net 成员资格提供程序跟踪给定用户的最后一次看到,即他们最后一次登录和访问页面的时间。您可以遵循类似的策略,同时注意用户的 IP 地址,也许还有浏览器的用户代理。

如果您在短时间内(例如 20 分钟)看到相同登录凭据的两个不同 IP 地址和/或用户代理,您可以假设它们很可能来自不同的设备。

意识到

正如我所说,在某些极端情况下你会出错。例如,移动设备上的某人会经常获得新的 IP 地址。

于 2012-07-31T23:19:40.810 回答
1

您可以在数据库中拥有用户last_activity_time文件,只要登录用户访问您的任何页面,该文件就会更新。您现在可以有一个窗口,例如 30 分钟(用户登录有效的一段时间)last_activity_time与当前时间进行比较,如果时间差大于所需的窗口(30 分钟),则认为用户不活动

于 2012-07-31T23:19:47.510 回答