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)
还有一个代码用于删除此表中的记录,该记录在以下时间执行:
Session_End事件中global.asax一切正常,完美,只需:
问题:当用户关闭浏览器时,该行不会被删除(我认为当他关闭浏览器时,该表中的行将在Session_End事件中删除,但它没有!)
我能做什么?解决这个问题的任何方法?我应该改变策略还是有解决方案?
抱歉我的语法错误.我是英文新手
任何想法都可能有用
问候
Foroughi
更新1:我不使用ASP 成员资格并自己管理我的用户
UPDATE2:我使用InProc模式进行会话状态,超时20分钟
Session_End 事件在浏览器关闭时不会触发,而是在服务器在特定时间段(默认为 20 分钟)内未收到用户的请求时触发。这意味着,如果您使用 Session_End 删除用户,他们在关闭浏览器后 20 分钟内将无法登录。
我想到了两种替代策略
当用户离开页面时,您可以使用浏览器中的 onunload 事件向服务器发送注销请求(当然这仅在用户仍然具有网络连接的情况下才有效)。当您重新加载页面时,也会触发 onunload 事件,因此您必须跟踪触发该事件的原因才能使用它。
您将上次请求的时间保留在用户对象中。这样您就可以确定用户的活跃程度以及他们离开网站的可能性。例如,找到任何两分钟内未执行任何操作的用户并将其注销。
编辑:作为评论中提出的最后一点。不要将您的要求视为“您只能有一次登录,因此如果您已经登录,则不允许登录”,您可以更改为“如果您打开了一个会话,则只能有一次登录,它将被取消,并创建一个新的”一个创建的。'
这样,您仍然可以保留每个帐户一个登录会话的规则,同时提供一种更强大的执行方法。
| 归档时间: |
|
| 查看次数: |
1433 次 |
| 最近记录: |