防止已登录用户C#的登录

时间:2013-04-15 09:25:35

标签: c# sql-server permissions

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

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

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

2 个答案:

答案 0 :(得分:4)

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

当他们登录时,如果它不是太新的话,请允许它们。也就是说:如果你在最后(比方说)30秒内从另一台PC上看过它们,那么请考虑该会话仍然存在,并拒绝新登录。

这样,如果他们的其他PC崩溃,时间戳将不会更新,并最终会过期。

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

答案 1 :(得分:0)

我建议您使用以下查询检查用户是否已建立与数据库的连接

SELECT loginame as LoginName,program_name
FROM sys.sysprocesses 
WHERE db_name(dbid)='my_database'  and loginame='test_user'

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

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

  • 应用程序名称 - 应用程序的名称,如果未提供应用程序名称,则为“.Net SqlClient Data Provider”。 (=上表中的program_name)

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

我相信无论客户端崩溃如何,此解决方案都可以正常工作,并且不需要在任何表格中保存状态。