gpt4 book ai didi

c# - 如何防止 ASP.NET 站点中同一用户 ID 的多次登录?

转载 作者:可可西里 更新时间:2023-11-01 08:15:25 25 4
gpt4 key购买 nike

如何防止多个用户同时使用一个用户 ID 登录?

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

  1. 如果浏览器中的 JavaScript 已关闭。
  2. 如果用户没有点击“注销”,而是直接关闭了浏览器。

建议将不胜感激。谢谢。

最佳答案

我们按照以下几行为此实现了一个系统:

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

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

  1. 用户有一个 cookie token 来证明他们在过去的某个时间点登录过 - 这对于向他们显示受限的网站内容来说很好。
  2. 用户在本次 session 中实际提供了他们的登录详细信息 - 在向他们显示任何个人详细信息(电子邮件地址、偏好、保存的职位搜索等)时,这是必需的。

几乎所有系统都会遇到的主要问题:

  1. 使用用户的 IP 地址是不可靠的 - 公司用户、代理背后的用户等通常共享一个 IP 地址,因此“看起来”是同一个用户。
  2. 依靠用户注销是不可靠的 - 用户的计算机/浏览器可能会崩溃而不给他们注销的机会,用户可能/将会忘记注销。
  3. 依赖 session 超时是不可靠的 - 如果您没有使用 InProc session ,SessionEnd 事件永远不会触发,如果您的服务器崩溃则不会调用该事件,等等。

您会发现像我这样的解决方案存在的问题是:

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

回复评论

针对您的具体查询:

  1. default Profile Provider将数据存储在与成员资格提供程序相同的 SQL 数据库中(这些表与成员资格和角色表一起创建)。如果您要将它存储在“缓存中”,这将需要是全局应用程序缓存,类似于 KMan suggests in option 2 - 正如评论所指出的,您需要为此建立一个超时,这又回到了可靠地确定这一点的问题。
  2. 用户未注销:这在我们的系统中通过不锁定 future 用户,而是锁定以前登录的用户来处理 - 因此:
    • 爱丽丝来到网站,登录,开始浏览。
    • Bob 来到该站点,并使用 Alice 的详细信息登录,开始浏览。
    • Alice 试图继续浏览,但被锁定,必须重新登录。
    • Bob 现在被锁定了。
    • 等等

在最基本的情况下,这不会阻止用户共享他们的登录信息,但会引起他们的烦恼,迫使他们继续登录。如果需要,您可以在登录过程中添加延迟 - 所以如果不同的session id 尝试在 session 超时(默认为 20 分钟)或其他时间(例如基于用户在页面上花费的平均时间)内登录站点,然后拒绝登录尝试。

关于c# - 如何防止 ASP.NET 站点中同一用户 ID 的多次登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com