2009-01-08 69 views
1

HI, 我做在C#(2.0)的Windows应用程序和SQL2005 Database.The网络应用ERP溶液通信通过使用Database.I正常技术用于用户登录和注销,保持一个状态位。我的问题是,当我的应用程序因任何其他原因而中断用户状态可能不会改变。这将导致用户无法在下次登录。如何解决此问题?你能给任何用户操作的新技术吗?用户登录技术C#运应用

回答

1

如果你的目的是要禁止不同计算机上的一个用户名的共享,凭有效的密码登录后,登录该计算机上的唯一令牌staff.last_logged_at = @unique_token。在注销时,设置staff.last_logged_at =''。这种方式即使计算机被中断(由于病毒程序崩溃,或意外按下了计算机的重置按钮等,因此last_logged_at未被重置为''),用户仍可以登录,只需检查用户当前登录的计算机与last_logged_at相同。如果相同,他/她仍然可以登录。



如果某些用户尝试使用其他用户的用户名登录,只检查,如果一些用户的计算机的机器令牌是与其他用户的last_logged_at一样,如果它是不相等的,会禁止登录,这意味着两个用户共享相同的密码。



现在,如果电脑死机真的很难方案(处理器融化,硬盘崩溃,操作系统需要重新安装,等)。用户必须被允许使用其他计算机。制作一个管理模块,可以重置该用户的last_logged_at。



对于@unique_token,只需使用任何为独特的计算机上永久,让我们说MAC地址,或哈希在操作系统设置任何东西。



伪代码:

Logging In: 

if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and (last_logged_at = '' or last_logged_at = @unique_token)) <> 0 then then 

    -- allow login   
    update staff set last_logged_at = @unique_token where staff_name = @staff_name 



else if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and last_logged_at <> @unique_token) <> 0 then then 

    -- disallow login 
    throw exception "You cannot use the same user name on two or more computers. Contact the administrator if you have any concerns" 

else 

    -- disallow login 
    throw exception "Wrong password" 

end if 


Logging Out: 

update staff set last_logged_at = '' where staff_name = @staff_name 
2

如何维持一个会话,每个登录跟踪用户登录的?快速而肮脏的解决方案是提供一个选项,让他们从“新位置”登录并使旧会话失效。然后,当您执行操作时,请首先检查会话是否仍然有效。

更好的实现是保持会话活着,并指定超时。 (即,如果该会议是X-分钟的时候,而无效。)然后,你将不会看到“幻影登录”从旧孤立的连接 - 他们自动失效。

+0

我做的Windows应用程序没有Web应用程序。 – Anoop 2009-01-08 08:21:53

+0

@Anoop:会话不是Web特定的。登录到Windows的用户也可以称为会话 – GvS 2009-01-08 08:49:22

+0

您能否给我一些更多的想法或关于会话的链接?我对此没有太多的想法。 – Anoop 2009-01-08 08:59:42

1

这里有两个共同的答案:

  • 如果您尝试登录,并且已经登录,提供突破(重置)现有登录
  • 使用轮询/超时 - 即有该应用每2分钟调用一次方法(例如)更新“最后一次听到”;如果您在5分钟内未收到任何人的讯息(例如),则清除标记
+0

谢谢.... 我明白了,但连续检查会让我的应用变慢?数据库放置在net.Hop你有更多的想法。 – Anoop 2009-01-08 08:25:18

0

为什么限制用户可以登录的次数?在Windows中,通常启动应用程序的多个实例。

我必须承认,我在我的Windows应用程序也有只有一个用户被允许的一部分。要查看是否有其他用户连接,我使用类似Marc的轮询算法。有一个强制输入的选项。

锁记录每分钟一次,两分钟的更新是不是资源密集型的(除非你有成千上万的用户)。