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

Ali*_*ghi 5 c# asp.net session sql-server-2008

我正在开发一个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
Run Code Online (Sandbox Code Playgroud)

当用户登录到站点时,我在此表中插入一行,如下所示:

UserId = The Id of logged in user 
Key = Session.SessionId
Run Code Online (Sandbox Code Playgroud)

还有一个代码用于删除此表中的记录,该记录在以下时间执行:

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

一切正常,完美,只需:

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

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

抱歉我的语法错误.我是英文新手

任何想法都可能有用

问候

Foroughi

更新1:我不使用ASP 成员资格并自己管理我的用户

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

ben*_*c_b 2

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

我想到了两种替代策略

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

  2. 您将上次请求的时间保留在用户对象中。这样您就可以确定用户的活跃程度以及他们离开网站的可能性。例如,找到任何两分钟内未执行任何操作的用户并将其注销。

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

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