如何防止用户多次登录我的网站
本文关键字:登录 我的 网站 何防止 用户 | 更新日期: 2023-09-27 18:24:04
我正在开发一个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
并且还有一个用于从该表中删除记录的代码,该代码在以下情况下执行:
- 用户尝试从其帐户注销
- 关于
global.asax
中的Session_End
事件
一切都是正确和完美的,只是:
问题:当用户关闭浏览器时,该行不会被删除(我以为当他关闭浏览器时该表中的行会在Session_End
事件中删除,但它没有!!)
我能做什么?这个问题有什么解决办法吗?我应该改变策略还是有解决方案?
抱歉我的语法不好。我是英语新手
任何想法都可能是有用的
关于
Foroughi
UPDATE1:我不使用ASP会员资格并自己管理我的用户
UPDATE2:我使用InProc模式进行会话状态,超时20分钟
Session_End事件不会在浏览器关闭时激发,而是在服务器在特定时间段(默认为20分钟)内没有收到用户的请求时激发。这意味着,如果你使用Session_End删除用户,他们在关闭浏览器后20分钟内将无法登录。
想到了两种替代策略
-
当用户离开页面时,您可以使用浏览器中的onunload事件向服务器发送注销请求(当然,只有当用户仍然具有网络连接时,这才有效)。onunload事件也会在您重新加载页面时触发,因此您必须跟踪事件被触发的原因才能使用它。
-
您可以在用户对象中保留最后一个请求的时间。通过这种方式,您可以确定用户的活跃程度,以及他们离开网站的可能性。例如,找到任何两分钟内没有做任何事情的用户并将其注销。
编辑:作为评论中提出的最后一点。与其将您的要求视为"",您只能有一个登录,因此如果您已经登录,则不允许登录,您可以更改为""吗?如果您打开了会话,则将取消并创建一个新的会话'
这样,您仍然可以保留每个帐户一个登录会话的规则,同时提供一种更强大的执行方法。
首先不要将数据库用作消息传递系统。这会带来灾难。
您应该做的是在应用程序存储中拥有一个字典,其中包含已登录的用户id及其最后操作时间。还要在所有页面上添加脚本,每2-5分钟ping一次服务器。
收到ping后,更新用户id的最新活动时间,并删除任何"超时"的用户id。
除了如何/在哪里存储状态之外,您还面临的问题是用户可能无法注销,从而使会话保持活动状态。我建议如下:
1) 当用户注销或会话结束时(会话在n分钟不活动后结束,有关事件处理程序,请参阅web.config和global.asax)更改状态(在您的情况下删除记录)
2) 如果用户试图再次登录,请提供注销前一个会话的选项。
我认为你应该试试smth。像这样:
表格结构:
ID
UserID
Flag
当用户登录时,您将更新表并将标志设置为true或1当他被注销时,将其设置为false或0
当用户关闭浏览器时,您应该决定是否将其注销。如果是,则将此事件捕获为Session_End,并自行将其注销,并将表更新为false或0