Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net如何使另一个会话的会话过期_C#_Asp.net_Session_Session State - Fatal编程技术网

C# asp.net如何使另一个会话的会话过期

C# asp.net如何使另一个会话的会话过期,c#,asp.net,session,session-state,C#,Asp.net,Session,Session State,我有一个要求,即如果用户登录到应用程序,任何与同一用户的会话都应注销,即如果同一用户试图从不同的IP登录到应用程序,然后,当用户登录时,第一个会话应该关闭。如果您在数据库中存储了最新使用的IP,则所有会话都可以在下一页加载或任何处理程序调用时检查它们的请求是否来自同一IP,如果不是,则可以调用session.放弃()不幸的是,ASP.NET的特性意味着您无法判断用户是否已经登录。当然,您可以记录用户已访问您的应用程序的事实,但无法判断他们是否已放弃旧会话(可能是通过关闭浏览器),也无法判断他们的

我有一个要求,即如果用户登录到应用程序,任何与同一用户的会话都应注销,即如果同一用户试图从不同的IP登录到应用程序,然后,当用户登录时,第一个会话应该关闭。

如果您在数据库中存储了最新使用的IP,则所有会话都可以在下一页加载或任何处理程序调用时检查它们的请求是否来自同一IP,如果不是,则可以调用
session.放弃()

不幸的是,ASP.NET的特性意味着您无法判断用户是否已经登录。当然,您可以记录用户已访问您的应用程序的事实,但无法判断他们是否已放弃旧会话(可能是通过关闭浏览器),也无法判断他们的新登录是否有效

您必须实现自己的方法

请查看以下内容:


我认为在他们真正尝试做一些事情,例如提出新请求之前,您无法将他们注销

我的建议是,总是将“上次使用的会话id”与用户发出的每个请求的时间戳一起存储

如果针对特定用户的下一个请求具有不同的会话id,您知道他们刚刚再次登录,因此您不应再接受来自旧会话id的请求,您可以删除他们的会话,然后将其重定向到错误页面请参阅:

正如上面@Massimiliano所说,您必须实现自己的解决方案

我有一个类似的需求,并提出了一个非常巧妙的解决方案,在上面的链接中演示了这一点。简而言之,我的要求是一次只能有一个用户登录。如果同一用户ID尝试在其他地方登录,则它会通过检查不同会话ID下的现有登录来终止第一次登录的会话(这使用户ID能够从其计算机上的多个web浏览器实例[相同会话ID]登录,这是常见的,但不是从不同的计算机登录)[不同的会话ID](可能是因为某人盗取了他们的凭据)。通过修改代码,您可能会更改此会话的行为-即,阻止第二次登录尝试,而不是终止已处于活动状态且正在使用的第一次登录


当然,它可能无法100%满足您的需要,因此请随意修改它以满足您的需要。

请提供一些来源…您迄今为止尝试了哪些?哪些不起作用?