如何检查用户是否已经登录?

4
我有一个ASP.NET网站。我想禁止用户使用相同的登录名从两台电脑登录。如果有人已经登录,其他人想用相同的登录名登录时,应该向他显示一条消息,说明该用户已经登录。我没有任何表单身份验证之类的东西。在“登录”按钮上,我只是连接到数据库并检查用户和密码是否有效。
我认为当用户登录后,我会在数据库中更新他的状态,当其他人尝试登录时,我将在数据库中检查该用户是否已经登录,但这不是一个好主意,因为当用户没有点击“注销”按钮时,它不会更新他的状态,表明他处于非活动状态。
除了表单身份验证或类似功能之外,有没有其他方法来实现这一点?

用户登录时还会发生什么?是否有会话令牌? - MStodd
是的,userId 已经保存在 Session 变量中了 :) - vanilla161
3个回答

1
说实话,如果让微软处理表单认证的细节会更容易,但是如果我被“挑战”不使用表单认证,我会这样做(还有其他方法,这只是我喜欢的其中一种):
  • 在登录时,我会为用户创建一个会话cookie(例如10分钟),该cookie将包含一个id,指向一个表格,我将在其中存储他们的用户ID、登录时间和他们引用的IP。我也会在cookie中包含这些信息(使用简单的加密)。在每个页面加载时,我会更新cookie以持续额外的10分钟,并检查凭据是否与数据库匹配。这意味着如果用户没有每十分钟访问网站,则会超时。这也将允许您知道用户何时从另一个位置登录。

顺便说一下:如果您使用自定义身份验证来进行Windows表单身份验证,则几乎所有上述内容都已为您处理。使用Windows表单身份验证意味着您不必担心超时和cookie管理。


1

没有完美的解决方案

您无法可靠地解决此问题,但可以接近。在某些情况下,合法用户可能会因此限制而感到沮丧。

您可以做什么

ASP.Net成员资格提供程序跟踪给定用户上次出现的时间,即他们最后一次登录和访问页面的时间。您可以采用类似的策略,还可以记录用户的IP地址和浏览器的用户代理。

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

请注意

正如我所说,有些情况下您会犯错。例如,使用移动设备的人经常会获得新的IP地址。


他不是说他不想使用ASP.Net的会员提供程序吗? - Hogan
我解释了ASP.Net成员资格提供程序的工作原理,然后建议他可以自己做类似的事情。 - Eric J.
好的,我看到你们都建议定期更新数据库中的activityTime和IP地址。听起来不错 :) 现在项目快完成了,改变登录到Forms身份验证会很难吗?我从未使用过Forms身份验证。PS. 是“她”,不是“他” ;) - vanilla161
表单身份验证非常容易在现有项目中添加。它主要通过配置文件进行控制。搜索一个好的教程并做一个小的示例项目来了解它的工作原理。 - Eric J.
好的,首先我会使用数据库方法让这个东西立即运行起来,然后我会尝试表单身份验证,谢谢 :) - vanilla161

1
您可以在数据库中拥有用户的last_activity_time文件,每当已登录用户访问您的任何页面时,该文件都会更新。现在,您可以设置一个窗口,例如30分钟(用户登录有效期),将last_activity_time与当前时间进行比较,如果时间差大于所需窗口(30分钟),则认为用户处于非活动状态。

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