我正在开发一个ASP.net站点(使用.NET 4,EF,jQuery Ajax,SQL Server 2008 R2)。在此网站中,我想阻止multi-login
。我的意思是,如果您登录到站点,则无法从其他浏览器或计算机再次登录到站点,因为您已经登录。
我提出了一个想法,并在我的网站上开发了它,但它有一个问题,这是因为我决定在这里问一个问题
我有一个像这样的SQL Server表:
Id [int] NOT NULL IDENTITY(1,1) //PK
UserId [int] NOT NULL //Relation to User table
Key [nvarchar](50) NOT NULL //Unique
当用户登录网站时,我会在此表中插入一行:
UserId = The Id of logged in user
Key = Session.SessionId
还有一个代码用于删除此表中的记录,该记录在以下时间执行:
Session_End
global.asax
事件
醇>
一切正常而完美,只是:
问题:当用户关闭浏览器时,该行不会被删除(我认为当他关闭浏览器时,该表中的行将在Session_End
事件中删除,但它没有!)
我该怎么办?解决这个问题的任何方法?我应该改变策略还是有解决方案?
抱歉我的语法错误。我是英语新手
任何想法都很有用
问候
Foroughi
UPDATE1 :我不使用ASP 会员资格并自行管理我的用户
UPDATE2 :我使用 InProc 模式进行会话状态,超时时间为20分钟
答案 0 :(得分:2)
当浏览器关闭时,Session_End事件不会触发,当服务器在特定时间内没有收到用户的请求时(默认为20分钟),它会触发)。这意味着如果您使用Session_End删除用户,他们在关闭浏览器后将无法登录20分钟。
想到两种替代策略
您可以使用浏览器中的onunload事件在用户离开页面时向服务器发送注销请求(这当然仅在用户仍具有网络连接时才有效)。重新加载页面时也会触发onunload事件,因此您必须跟踪触发事件的原因才能使用它。
您将最后一个请求的时间保留在用户对象中。这样,您就可以确定用户的活跃程度以及他们离开网站的可能性。例如,找到任何两分钟没有做任何事情的用户并将其注销。
编辑:作为评论中提出的最后一点。而不是将您的需求视为',您只能有一个登录,所以如果您已经登录但不允许登录'您可以更改为',如果您有,则只能登录一次会话打开它将被取消并创建一个新会话。'
这样,您仍然可以按照帐户规则保留一个登录会话,同时提供更强大的强制执行方法。
答案 1 :(得分:2)
首先不要将数据库用作消息传递系统。这是灾难的秘诀。
您应该做的是拥有一个字典,其中包含登录用户ID以及它们在应用程序存储中的最后操作时间。还要在每2-5分钟ping一次服务器的所有页面上添加脚本。
收到ping后,请更新用户ID的最新活动时间,并删除所有“超时”的用户ID。
答案 2 :(得分:1)
除了存储状态的方式/位置之外,您所遇到的问题是用户可能无法注销,从而使会话保持活动状态。我建议如下:
1)当用户注销或会话结束时更改状态(在您的情况下删除记录)(会话在n分钟不活动后结束,请参阅web.config和global.asax以获取事件处理程序)
2)如果用户尝试第二次登录,则提供退出上一个会话的选项。
答案 3 :(得分:0)
我认为你应该试试smth。像这样:
表格结构:
ID
UserID
Flag
当用户登录时,您更新表并将标记设置为 true 或 1 当他退出时,将其设为假或 0
当用户关闭浏览器时,您应该决定是否将其注销。如果是 - 您将此事件作为 Session_End 捕获并自行将其记录下来并将表更新为 假或 0