大家好,我正在做C#(2.0) windows应用程序和SQL2005 Database.The网络应用程序通过数据库通信的ERP解决方案。我使用普通的技术进行用户登录和注销,保持状态bit.My的问题是当我的应用程序由于任何其他原因中断时,用户状态可能不change.That会导致用户无法在下一个time.How登录。我能解决这个问题吗?你能给出一些新的用户操作技术吗?
发布于 2009-01-08 09:59:44
如果您打算禁止在不同计算机上共享同一用户名,请在使用有效密码登录后,将该计算机上的唯一令牌登录到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发布于 2009-01-08 08:02:34
如何通过为每次登录维护一个会话来跟踪用户登录?快捷的解决方案是提供一个选项,让他们从“新位置”登录,并使旧会话无效。然后,当您去执行操作时,首先检查会话是否仍然有效。
更好的实现是让会话保持活动状态并指定超时。(即,如果会话已存在x分钟,则使其无效。)然后,你将不会看到来自旧的孤立连接的“幻影登录”-它们会自动过期。
发布于 2009-01-08 08:03:17
这里有两个常见的答案:
标志
https://stackoverflow.com/questions/423547
复制相似问题