我们有一个Web应用程序,其功能是使用信用卡登录 重要的要求是,一旦用户登录,就不允许从任何其他系统或同一系统上的其他浏览器登录 我们使用以下基于mssql的解决方案:我们将“Is_Loggedin”保留为表中数据类型为“bit”的列。当用户登录时,我们将标志设置为“1”,当有人尝试再次登录时,系统显示错误“用户已登录” 当用户注销位变为“0”表示用户注销时。 但是,这种逻辑在以下场景中失败
问题场景: 当用户关闭浏览器时,标志为“1”并且用户被锁定或用户遇到系统问题且无法注销的情况
有没有更好的逻辑来处理这个要求?
答案 0 :(得分:0)
当用户登录时,您可以进行一次AJAX调用,每隔30秒就会对服务器进行一次ping操作。有一个列Is_LoggedIn,Last_LoggedIn用于上次发送该AJAX调用的日期/时间。如果超过(例如1分钟),则允许用户从另一个系统登录。
如果用户的浏览器打开时间超过会话超时时间(通常为20分钟),您也会遇到问题。然后他们将在下一个请求中注销,但由于is_LoggedIn设置为1而无法再次登录。您最好做一些基于时间的解决方案,因为要跟踪用户是否仍在积极使用一个网站是一个非常棘手的问题,因为他们可以通过多种方式离开网站而不会实际登出。
如果避免用户登录多个地方是绝对关键的,那么当用户登录到某个新位置时,您也可以强制所有其他地方自动注销。
答案 1 :(得分:0)
您可以在global.asax的session_end事件中将'Is_Loggedin'标志更新为0。 session_end事件总是被调用。 session_timeout到期时会话_end事件调用。
答案 2 :(得分:0)
我相信会话结束的偶数。您可以绑定到该方法并将用户的Is_LoggedIn标志设置为0.然后,您还需要将用户绑定到会话密钥以便能够跟踪用户的会话。
编辑: 此外,如果用户关闭浏览器,使用会话cookie或普通cookie可能会有所帮助。 cookie将在重新打开浏览器窗口时对其进行身份验证;但是,如果用户使用公共计算机,则存在潜在的安全漏洞。
答案 3 :(得分:0)
您可能会在一段时间不活动(例如30分钟)后将用户注销。这样,如果用户在没有注销的情况下关闭浏览器,他将能够在30分钟后再次登录。
答案 4 :(得分:0)
使用Session_End作为Pankaj建议在注销时确保用户的位设置为0.
系统故障问题是另一个问题。也许这可以解决这个问题:当用户登录时,将用户的会话ID存储在数据库中。用户注销时,清除会话ID。每次用户发出请求时,您都要验证会话ID是否与存储在数据库中的会话ID相匹配。如果不是这种情况,则使会话无效,以便用户注销。
这应该发生:如果用户登录,则在另一个浏览器中,会话ID将被更新。如果用户然后返回到第一个浏览器窗口并点击某些内容,则该会话将失效,并且该用户将自动注销。