2012-07-31 186 views
4

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

我认为,当用户登录时,我会更新他在数据库中的状态,当别人会尝试登录时,我会检查数据库中该用户是否已经登录,但这不是个好主意,因为当用户没有点击按钮“登出”时,它不会更新他在数据库中的状态,他不活跃。

是否有任何其他的方式来做到这一点没有表单身份验证和类似的东西?

+0

比较last_activity_time与当前时间30分钟(用户登录有效的时间段)用户登录时会发生什么?有会话令牌吗? – MStodd 2012-07-31 23:18:15

+0

是的,userId在Session变量中被记住:) – vanilla161 2012-07-31 23:29:18

回答

1

没有完美的解决方案

您不能可靠地解决这个问题,但你可以接近。在这种情况下,合法用户会感到沮丧。

你能做什么

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

如果你看到一个短窗内相同的登录凭据两个不同的IP地址和/或用户代理(比如20分钟),你可以认为他们是最有可能从不同的设备。

注意

正如我所说的,有边缘情况下,你将是错误的。例如,移动设备上的某个人经常会获得新的IP地址。

+0

他不是说他不想使用ASP.Net成员资格提供程序吗? – Hogan 2012-07-31 23:21:22

+0

我解释了ASP.Net成员提供者是如何工作的,然后建议他可以自己做一些类似的事情。 – 2012-07-31 23:29:46

+0

好的,我看到你们都推荐定期更新带有activityTime和IPaddress的数据库。听起来不错:)当项目即将完成时,现在是否很难将登录更改为Forms Authentication?我从来没有使用表单身份验证。 PS。 “她”,而不是“他”;) – vanilla161 2012-07-31 23:42:07

1

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

  • 在日志中我会为用户创建会话cookie(比如10分钟),此cookie将包含一个ID,一个表,其中我将存储他们的用户ID,登录时间,IP,他们从引用。我也会将这些信息包含在cookie中(通过一种简单的加密方式),在每次页面加载时我都会将cookie更新为额外的10分钟,并根据数据库检查凭据。这意味着如果用户每十分钟不访问该网站,会话将超时。这也可以让你知道用户何时从另一个位置登录。

备注:如果您使用Windows窗体的自定义身份验证,几乎所有上述内容都将为您照顾。使用Windows窗体认证意味着您不必担心超时和cookie管理。

1

您可以让数据库中的用户last_activity_time文件在登录用户访问您的任何页面时更新。你现在可以有一个窗口,例如如果时间差大于所需窗口(30分钟),则认为用户处于非活动状态

相关问题