如何防止同一用户在不同的PC上同时登录

时间:2009-06-25 09:32:55

标签: c# asp.net

我们已经构建了一个内部网应用程序,用户必须登录才能执行某些任务... 我们必须确保没有“应用程序用户”同时登录多次。

所以我现在所做的是将当前的asp .net会话ID存储在数据库中,然后我在每个页面加载时比较它们是否相同。会话ID在用户登录时存储在数据库中。

但是通过使用这种检查,总是需要数据库选择。所以我不太喜欢这种方式。必须有一种更优雅的方法来解决这个问题,或者?

我们使用ASP .Net2,C#..

提前感谢任何输入

[信息更新]

我已经创建了一个自定义的Membershipprovider和一个自定义的Membershippuser。 Membershipuser有一个名为“StartSession(string sessionId)”的方法,当用户登录时使用该方法。

另一种方法CheckSession(字符串sessionId)用于每次回发,并将当前会话ID与存储在数据库中的会话ID进行比较。

[更新] 感谢大家的投入。我现在将使用缓存来防止永久数据库访问。我首先想到已经有一个类或已经处理过这个问题的东西了。

6 个答案:

答案 0 :(得分:4)

您现有的将此信息存储在数据库中的方法是合理的,如果事情扩大,它会有所帮助。

但是,您也可以使用System.Web.Caching.Cache对象来跟踪用户当前会话。如果在缓存对象中找到信息失败,则回退到从数据库中读取信息,然后将该信息放在缓存中以便后续请求。

答案 1 :(得分:3)

我建议的主要变化是你创建一个会话缓存来检查,而不是在每个页面加载时使用数据库。

它将以类似的方式工作 - 您将检查缓存中的会话ID以进行验证,并在验证失败时采取相同的操作。您只需要进行数据库调用。

答案 2 :(得分:3)

虽然今天早些时候我正在寻找与此相关的内容,但我遇到了可能有用的这篇文章:

  

Preventing Multiple Logins in ASP.NET (EggHead Cafe)

答案 3 :(得分:1)

正如其他答案所述,缓存将为您提供性能提升,但请检查您是否确实需要这个内联网应用程序。

您所描述的内容打破了Web应用程序的标准模型,我会质疑其纯粹出于许可原因的价值。特别是如果您打算尝试阻止人们打开多个标签 - 您可能会开始执行一项非常困难的任务,这只会降低用户体验的质量。

答案 4 :(得分:0)

嗯,我知道这是很老的帖子,但是最近我通过使用formsauthentication票证解决了这个问题,我正在检查并维护所有登录用户的静态字典,以及他们来自formsauth票证的登录时间戳。当第二个用户登录另一台计算机时,他在该词典中更新其时间戳。现在,当第一个用户尝试验证其FormsAuth时间戳时,他将在词典中找到另一个时间戳,并注销会话,这样,只有新登录的用户才能存活。.

答案 5 :(得分:-2)

使用附加字段Active或类似内容为用户登录创建数据库。在用户身份验证中,如果已经为true,则检查此字段中的值是否为true如果Active的值为false,则通过javascript“User already Logged in”显示消息,更新并将其设置为true并将用户验证为下一页或形成。用户身份验证后,在导航页面的page_load事件中检查此项。如果用户已经登录,那么页面控件可以是只读的,可以在页面上更改记录。

我用过它并且有效。我的申请中没有会话。