c# - 单实例登录实现

标签 c# asp.net

我在我的项目(一个在 ASP.NET 2.0 中构建的 Web 应用程序)中遇到了一个严重的问题,解释如下。

假设我给了用户 ID“singh_nirajan”,用户说“User1”使用这个用户 ID 登录到系统。现在我的要求是每当其他用户让用户“User2”尝试使用相同的 (singh_nirajan) 用户 ID 登录系统时,它会显示一条消息“singh_nirajan 已经登录”。

为了实现相同的目的,我只更新了数据库中的一个标志。同样,只要用户正确注销,我们就会更新数据库中的标志。我们还处理了一些用户无法正确注销的情况,如下所示。

  1. 点击 (X) 关闭浏览器
  2. session 超时
  3. 出错

但是由于网络故障、电源故障或任何此类原因,用户突然退出。我无法更新数据库中的标志,这就是为什么用户无法使用相同的用户 ID 登录,除非我们手动更新该标志。

上述实现的原因:

有时一个用户打开多个浏览器并在不同的浏览器中开始繁重的处理任务,很多时候他们共享他们的用户名和密码,这有时会引起并发问题。为了限制这种情况,我们需要实现单实例登录。

任何人都可以建议我任何其他方法来实现上述内容。

提前致谢。

最佳答案

浏览器本质上是断开连接的系统(就所有意图和目的而言)。您不能依赖在用户浏览器 session 结束时获得任何通知(来自客户端)。

个人(作为用户)我会发现这种单一登录行为很烦人,因为我经常在不同的计算机上访问同一个网站(笔记本电脑、台式机、家庭、工作、虚拟机主机和虚拟机 guest )或同一台机器上的多个浏览器(特别是浏览器兼容性测试),但我接受这可能是一项要求。

IMO,如果您有“单一 session ”要求,更好的方法是“最后获胜”——即,如果您登录第二个 session ,您就注定了第一个 session (基本上破坏了他们的 token )——所以第一个 session 被注销。这很容易做到(在数据库中,只需在登录时更改 guid 或增加计数器(针对特定用户))。如果需要,您可以将 second session 的 IP(或其他)记录到您注定要失败的 session 中,但是如果第二个 session 可以将自己验证为“singh_nirajan”,那么在大多数常见情况下这就足够了.

关于c# - 单实例登录实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377357/

相关文章:

c# - 在 C# 中禁用单元测试的超时

c# - Metro 8 - 绑定(bind) ListView 导致 System.ArgumentException "Value does not fall within the expected range"

c# - 这种选择使用哪个 C# 集合的策略缺少什么?

c# - 动态创建的链接按钮上的单击事件不起作用

c# - 我可以保证 Response.Filter 的 Stream.Write() 方法不会有部分字符字节吗?

c# - 数据表添加数据行时出现错误[]

c# - Entity Framework 连接字符串定义

asp.net - 推荐一本关于 ASP.NET 应用程序负载测试的书

javascript - 从下拉列表中选择值时调用 javascript 函数

asp.net - 可以将 Web 服务中定义的常量暴露给消费客户端(.Net 双方)