Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单实例登录实现_C#_Asp.net - Fatal编程技术网

C# 单实例登录实现

C# 单实例登录实现,c#,asp.net,C#,Asp.net,我在我的项目(一个在ASP.NET 2.0中构建的web应用程序)中面临一个严重的问题,解释如下 假设我给了用户ID“singh_nirajan”,一个用户说“User1”使用这个用户ID登录到系统。现在我的要求是,每当其他用户(比如用户“User2”)尝试使用相同的(singh_nirajan)用户ID登录系统时,它将显示一条消息“singh_nirajan已登录” 为了实现同样的功能,我只更新了数据库中的一个标志。类似地,只要用户正确注销,我们就会更新数据库中的标志。我们还处理了一些用户无法

我在我的项目(一个在ASP.NET 2.0中构建的web应用程序)中面临一个严重的问题,解释如下

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

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

  • 通过单击(X)关闭来关闭浏览器
  • 会话超时
  • 论错误
  • 但不知何故,由于网络故障、电源故障或任何此类原因,用户会突然注销。我无法更新数据库中的标志,这就是为什么用户不能使用相同的用户ID登录,除非我们手动更新该标志

    上述实施原因:

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

    有谁能给我建议其他方法来实现上述内容吗


    提前谢谢

    浏览器本质上是断开连接的系统(出于所有目的)。用户的浏览器会话结束时,不能依赖于(从客户端)获取任何通知

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


    依我看,如果你有一个“单一会话”的要求,更好的方法是“最后的胜利”——即如果你登录第二个会话,你就注定了第一个会话(基本上破坏了他们的令牌)——因此第一个会话将被注销。这很容易做到(在数据库中,只需在登录时更改guid或增加计数器(针对特定用户)。如果需要,您可以将第二个会话的IP(或任何内容)记录到您正在涂鸦的会话上,但如果第二个会话可以将自己验证为“singh_nirajan”,那么在大多数常见场景中,这就足够了。

    保存登录标志时,设置LastLoginDatime字段


    在登录方法中,使用查看位和日期时间戳的逻辑来确定这是否是一个从未正确关闭的旧会话。

    这里的技巧是确定通信来自同一台机器。在windows应用程序中,您可以将工作站名称传递给数据库。允许来自同一工作站的两个登录请求;来自不同工作站的两个将被拒绝。然而,在网络上没有简单的方法可以做到这一点。如果您的公司不使用DHCP或每个人都有IP预约,您可以尝试使用IP。如果在WinForms中执行应用程序不是一个选项,那么您可以尝试使用一个小的click once应用程序将工作站名称传递给db。回到过去,人们会通过强制IE和使用ActiveX控件在Intranet应用程序上解决这个问题。幸运的是,我们已经超越了这一点,但它确实解决了这类问题。

    是否应该允许同一用户从同一台机器登录两次(例如,如果浏览器死机,机器重新启动等)?是否应允许同一用户从同一台计算机上的两个不同窗口登录?此应用程序是否在内部网上?是否需要支持多个平台(如Mac、Linux等)?是的,如果浏览器死机,用户应该能够登录。主要问题是,一次只能有一个用户使用同一台机器或任何其他机器上的特定用户ID登录。此应用程序位于intranet上,不支持多个平台。这里的问题源于您让两个人共享同一个用户ID。你能再解释一下你为什么不遵循“一个用户ID公关人员”的做法吗?@Marc我不能强迫第一个会话注销,可能他/她将要做任何重要的活动,我们不能踢他/她在中间。“Nejaya-听起来你想要一些你不能拥有的理由,也就是说你无法保证退出事件。这就是为什么最后的胜利是最好的方法。你这里的问题不是基于系统而不是基于人员的-没有理由登录两次,尤其是如果他们正在积极从事某项工作,那么你真的需要接受为其开发的平台的约束,并重新审视需求。@Nirajan:“他/她”不是做这项重要活动的同一个人吗?如果是这样,为什么他/她在进行其他活动的同时还要登录?除非有一些罕见的情况,两个人拥有相同的用户名,这是系统应该能够防止的。现在我已经更新了我的任务,并说明了实现的原因