gpt4 book ai didi

c# - 如何防止用户多次登录我的站点?

转载 作者:太空狗 更新时间:2023-10-29 23:17:07 25 4
gpt4 key购买 nike

我正在开发一个 ASP.net 站点(使用 .NET 4、EF、jQuery Ajax、SQL Server 2008 R2)。在此站点中,我想防止多登录。我的意思是,如果您登录站点,您将无法从其他浏览器或计算机再次登录站点,因为您已经登录了。

我提出了一个想法并在我的网站上开发了它,但它有一个问题,正是因为这个问题,我决定在这里提出一个问题

我有一个像这样的 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 成员(member)资格,而是自己管理我的用户

UPDATE2 :我对我的 session 状态使用 InProc 模式,超时为 20 分钟

最佳答案

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

我想到了两种替代策略

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

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

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

通过这种方式,您仍然可以为每个帐户规则保留一个登录 session ,同时提供一种更强大的方法来执行它。

关于c# - 如何防止用户多次登录我的站点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com