在asp.net网站中如何防止同一用户ID的多次登录?

haa*_*nsi 12 c# asp.net

请指导如何使用用户ID一次防止多个用户登录?

我搜索了互联网并找到了一些方法,但不知怎的,他们在这些情况下不起作用:

  1. 如果brower中的javascript被关闭.
  2. 如果用户没有单击注销并直接关闭浏览器.

请给我一些建议.

谢谢

haan​​si

Zha*_*uid 18

我们按照以下方针为此实施了一个系统:

  • 为用户配置文件添加了一个属性以保存其会话ID.
  • 每当用户登录时,将其会话ID存储在配置文件中.
  • 在需要此级别安全性的任何页面上,检查存储在配置文件中的会话ID是否与其会话匹配.此检查可以在自定义AuthorizeRequest事件处理程序中执行,也可以在这些页面派生自的Base类中执行,如果不是,则将它们重定向到登录页面.

我们选择了基类选项,因为我们有两个级别的身份验证:

  1. 用户有一个cookie令牌来证明他们已经在过去的某个时间点登录 - 这对于向他们显示受限制的站点内容很好.
  2. 用户实际上已在此会话中提供了他们的登录详细信息 - 在向他们显示任何个人详细信息(电子邮件地址,首选项,保存的工作搜索等)时,这是必需的

您几乎可以在任何系统中找到的主要问题:

  1. 使用用户IP地址是不可靠的 - 企业用户,代理人后面的人等经常共享一个IP地址,因此"看起来"是同一个用户.
  2. 依赖用户注销是不可靠的 - 用户计算机/浏览器可能崩溃而不给他们注销的机会,用户可能/将忘记注销.
  3. 依赖会话超时是不可靠的 - 如果您不使用InProc会话,则SessionEnd事件永远不会触发,如果您的服务器崩溃,则不会调用事件等.

您可以通过我的解决方案找到的问题是:

  1. 它不会阻止第二个用户登录 - 而是会锁定第一个用户,这应该首先阻止共享细节.
  2. 如果您没有将其实现为AuthorizeRequest处理程序,则必须记住对应该锁定的页面执行检查.

回应评论

针对您的具体问题:

  1. 默认的配置文件提供存储在同一个SQL数据库作为成员资格提供的数据(表与成员和角色表一起创建).如果你要将它"存储在缓存中",那么这就需要是全局应用程序缓存,就像KMan在选项2中所建议的那样 - 并且正如指出的那样,你需要为此建立一个超时,这导致了可靠地确定这一点的问题.
  2. 用户不会注销:这是在我们的系统中通过不锁定未来用户来处理,而是通过锁定以前登录的用户 - 所以:
    • Alice来到该网站,登录,开始浏览.
    • Bob来到该网站,并使用Alice的详细信息登录,开始浏览.
    • Alice试图继续浏览,被锁定,必须再次登录.
    • 鲍勃现在被锁定了.
    • 等等

最基本的,这不会阻止用户共享他们的登录,但会导致他们烦恼,迫使他们继续登录.如果需要,可以为登录过程添加延迟 - 所以如果尝试不同的会话ID在会话超时(默认为20分钟)或其他时间(例如,基于用户在页面上花费的平均时间)登录站点,然后拒绝登录尝试.


KMå*_*Mån 11

可能有几种可能性.快速回复是:

  1. 在数据库中保持一个标志; 每次登录/退出时都会更新标志.例如,如果标志已经为真,则每次认证请求都可以拒绝登录请求.

  2. 或者,您可以维护Application对象中的用户列表,并使用.Contains它来查看它是否已存在.

- 编辑 -

让我们尝试数据库标志选项; 并假设您有一个名为StillLoggedIn(User)更新日期/时间和标志的方法.

因此,当用户登录时:

  1. 该应用程序将验证用户并设置flag = 1,并标记日期/时间戳.
  2. 对于后续请求,应用程序会调用StillLoggedIn(User);

  3. 准备一个不时浏览数据库的Windows服务(如果你有10000个用户,可以说5分钟后).该服务将数据库日期/时间与当前日期/时间进行比较,并将该标记标记为0好像currentTime减去lastUsedTime大于,比如说5分钟.

它可以是数据库和Windows服务之外的任何东西.

  • 对于没有正确注销的登录用户,您需要某种不活动超时机制. (6认同)