【发布时间】:2011-08-04 11:47:14
【问题描述】:
我有一个要求,如果用户登录到应用程序,则应注销与同一用户的任何会话,即如果同一用户尝试从不同 IP 登录到应用程序,则应在用户登录时关闭第一个会话.
【问题讨论】:
-
请显示一些来源...到目前为止您尝试了什么?什么没用?
标签: c# asp.net session session-state
我有一个要求,如果用户登录到应用程序,则应注销与同一用户的任何会话,即如果同一用户尝试从不同 IP 登录到应用程序,则应在用户登录时关闭第一个会话.
【问题讨论】:
标签: c# asp.net session session-state
不幸的是,ASP.NET 的本质意味着您无法判断用户是否已经登录。当然,您可以记录用户访问您的应用程序的事实,但无法判断他们已经放弃了旧会话(可能是通过关闭浏览器),因此他们的新登录是有效的。
你必须实现你自己的方法
请看下面:
如果您将最新使用的 IP 存储在数据库中,所有会话都可以在下一页加载或任何处理程序调用时检查它们的请求是否来自同一 IP,如果不是,您可以调用 Session.Abandon();
【讨论】:
我认为在他们真正尝试做某事(即提出新请求)之前,您无法将他们注销。
我的建议是始终将“上次使用的 session_id”连同时间戳一起存储在用户提出的每个请求中。
如果针对特定用户的下一个请求具有不同的 session_id,您知道他们刚刚再次登录,因此您不应再接受来自旧 sessionid 的请求,您可以删除他们的会话,然后将它们重定向到错误页面
【讨论】:
请参考:
正如@Massimiliano 上面所说,您必须实施自己的解决方案。
我有类似的要求,并提出了一个非常巧妙的解决方案,如上面的链接所示。简而言之,我的要求是一次只能有一个用户登录。如果相同的用户 ID 尝试在其他地方登录,那么它会通过检查不同会话 ID 下的现有登录来终止第一次登录的会话(这使得用户 ID 可以从其多个实例登录)他们计算机上的网络浏览器 [相同的会话 ID],这很常见,但不是来自不同的计算机 [不同的会话 ID](例如,可能是由于某人窃取了他们的凭据))。通过修改代码,您可能会改变其行为 - 即阻止第二次登录尝试,而不是杀死已经处于活动状态且正在使用的第一次登录。
当然,它可能无法 100% 满足您的需求,因此请随意修改以满足您的需求。
【讨论】: