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

时间:2012-02-09 08:08:47

标签: c# asp.net sql-server-2008 session

我正在开发一个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. Session_End
  3. 中的global.asax事件

    一切正常而完美,只是:

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

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

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

    任何想法都很有用

    问候

    Foroughi

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

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

4 个答案:

答案 0 :(得分:2)

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

想到两种替代策略

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

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

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

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

答案 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