2012-03-04 73 views
2

要求: 用户可以每个会话期间登录只有一次。例如,如果用户从两台不同的机器登录到网站,该网站将显示一条消息“该帐户已被使用”。如果用户从两个不同的浏览器登录,这将适用。如何避免从多台机器使用相同的帐户?

我正在使用“InProc”会话的Web应用程序。该应用程序执行以下操作:

A- When user login, Put Session_ID, user_ID and IP in a table called Sessions. 

B- When Session_End is called, Set the row of Sessions table to be marked InActive. 

C- When Application_Start is called, the web app deactivate all Sessions. 

第一:我不喜欢这样,它会导致数据库中的死锁。我无法验证原因。

二:是Session_End中出示担保在所有情况下运行,我找不到MSDN页说,当应用程序池被回收Session_End中被调用。见http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemodule.end.aspx

你有一个更好的主意吗? Session_End是否每次调用应用程序池是否被回收?

感谢

+1

阅读20次,没有答案,是不是太复杂?或难以理解的问题?! – Costa 2012-03-04 15:41:09

+2

注意:当用户关闭浏览器时,他将不能再次登录,直到前一个会话过期。在把它作为一个“bug”记录之前,一定要告诉利益相关者。 – 2012-03-05 11:35:12

回答

1

我觉得你有什么是概念上是正确的,但我不认为你可以依靠Session_End中激发事件,因为如果用户点击你的网站时,他们的会话已过期,这只会发生,而不仅仅是关闭浏览器。

您还可能需要的是一种服务,它定期运行并在经过一段时间后从您的会话表中删除项目(您可能希望在创建/刷新会话时更新日期字段) 。

不知道你在哪里死锁是从哪里来的,但我猜你不关闭正确的东西......

+0

“,因为只有当用户在会话过期时点击您的网站才会发生这种情况。” 这是不准确的,Session_End是通过HttpApplication实例调用时,会话是abodon或过期,无论任何HTTP命中。 – Costa 2012-03-05 12:58:53

+0

也许是这样,但Hans Kesting对这个问题的评论在这里非常适用。 – Paddy 2012-03-05 13:53:43