阻止已经登录的用户登录c#

本文关键字:登录 用户 | 更新日期: 2023-09-27 18:09:16

我有一个桌面c#应用程序,几个客户端连接到SQL服务器。每个用户都有一个ID和密码。我想要的是防止已经登录的用户从另一台计算机登录。

我通过更新数据库中的字段'UserLoggedIn'=true在登录时实现了它,当用户注销字段更新为False时。但是这个解决方案不是最优的,如果系统崩溃或计算机意外关机,值将在数据库中保持'UserLoggedIn'=True,并且该用户将永远无法再次登录到系统。

最佳解决方案是什么,并防止已经登录的用户从另一台计算机登录?

阻止已经登录的用户登录c#

在数据库中存储时间戳,而不是true。请确保在用户登录时定期更新它。

当他们登录时,如果不是太新,允许他们登录。也就是说:如果你在最近(比如说)30秒内从另一台PC上看到他们,那么就认为该会话仍然有效,并拒绝新的登录。

这样,如果他们的另一台电脑崩溃了,时间戳不会更新,最终会过期。

更新频率应该是过期时间的两倍左右。例如,如果您希望会话过期时间为1分钟,则应该每30秒更新一次时间戳。

我建议您使用以下查询

检查用户是否已经建立了到数据库的连接
SELECT loginame as LoginName,program_name
FROM sys.sysprocesses 
WHERE db_name(dbid)='my_database'  and loginame='test_user'

如果返回的记录数大于零,则可以假设用户已经从应用程序连接到数据库。

如果您查看MSDN中的连接字符串属性,您将发现以下感兴趣的属性。可以将这两个属性添加到现有的连接字符串中,以进一步改进可以在上面的查询

中定义的过滤器。
  • 应用程序名称 -应用程序的名称,或'。如果没有提供应用程序名称,则使用。Net SqlClient Data Provider'。(=program_name)

  • 工作站ID -连接到SQL Server的工作站的名称。(=主机名)

我相信这个解决方案可以在客户端崩溃的情况下工作,并且不需要在任何表中保存状态