如何防止用户多次登录我的网站

本文关键字:登录 我的 网站 何防止 用户 | 更新日期: 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

并且还有一个用于从该表中删除记录的代码,该代码在以下情况下执行:

  1. 用户尝试从其帐户注销
  2. 关于global.asax中的Session_End事件

一切都是正确和完美的,只是:

问题:当用户关闭浏览器时,该行不会被删除(我以为当他关闭浏览器时该表中的行会在Session_End事件中删除,但它没有!!)

我能做什么?这个问题有什么解决办法吗?我应该改变策略还是有解决方案?

抱歉我的语法不好。我是英语新手

任何想法都可能是有用的

关于

Foroughi

UPDATE1:我不使用ASP会员资格并自己管理我的用户

UPDATE2:我使用InProc模式进行会话状态,超时20分钟

如何防止用户多次登录我的网站

Session_End事件不会在浏览器关闭时激发,而是在服务器在特定时间段(默认为20分钟)内没有收到用户的请求时激发。这意味着,如果你使用Session_End删除用户,他们在关闭浏览器后20分钟内将无法登录。

想到了两种替代策略

  1. 当用户离开页面时,您可以使用浏览器中的onunload事件向服务器发送注销请求(当然,只有当用户仍然具有网络连接时,这才有效)。onunload事件也会在您重新加载页面时触发,因此您必须跟踪事件被触发的原因才能使用它。

  2. 您可以在用户对象中保留最后一个请求的时间。通过这种方式,您可以确定用户的活跃程度,以及他们离开网站的可能性。例如,找到任何两分钟内没有做任何事情的用户并将其注销。

编辑:作为评论中提出的最后一点。与其将您的要求视为"",您只能有一个登录,因此如果您已经登录,则不允许登录,您可以更改为""吗?如果您打开了会话,则将取消并创建一个新的会话'

这样,您仍然可以保留每个帐户一个登录会话的规则,同时提供一种更强大的执行方法。

首先不要将数据库用作消息传递系统。这会带来灾难。

您应该做的是在应用程序存储中拥有一个字典,其中包含已登录的用户id及其最后操作时间。还要在所有页面上添加脚本,每2-5分钟ping一次服务器。

收到ping后,更新用户id的最新活动时间,并删除任何"超时"的用户id。

除了如何/在哪里存储状态之外,您还面临的问题是用户可能无法注销,从而使会话保持活动状态。我建议如下:

1) 当用户注销或会话结束时(会话在n分钟不活动后结束,有关事件处理程序,请参阅web.config和global.asax)更改状态(在您的情况下删除记录)

2) 如果用户试图再次登录,请提供注销前一个会话的选项。

我认为你应该试试smth。像这样:

表格结构:

 ID
 UserID
 Flag

当用户登录时,您将更新表并将标志设置为true1当他被注销时,将其设置为false0

当用户关闭浏览器时,您应该决定是否将其注销。如果是,则将此事件捕获为Session_End,并自行将其注销,并将表更新为false0