当ASP.NET MVC会话过期时,注销用户登录

3
在ASP.NET MVC中,在WCF服务的一个方法中,我将一个对象放入HttpContext.Current.Session对象中。
当会话超时并且所有对象都已清除时,我想要注销用户,但一直找不到方法。
在Global.asax中,
当Session_end方法被调用时,Response对象和HttpContext.Current都为null。
如何注销用户有任何想法都会很感激。

这不取决于你最初如何实现会员制吗? - Rowan Freeman
抱歉我的无知,我只是维护现有的工作,并不了解所有内容。有一个控制器带有一个登录方法,该方法使用ttpContext.GetOwinContext().Authentication并分别调用SignIn和SignoOut方法来登录和注销用户。我不确定如何从Global.asx文件中调用此控制器,或者在会话过期时如何调用它。 - TheWommies
这将是手动的,没有自动化功能。您将需要检测无会话,并调用相应的代码以注销该用户。 - Erik Philips
你正在使用哪种身份验证方案(Forms、WebSecurity、Identity等)? - Erik Philips
你能进一步描述一下“注销用户”的意思吗?如果会话已过期,用户已经离开了。您是否想要进行一些服务器端的清理工作? - Matt Tester
4个回答

2
当会话超时,用户不再存在于任何情况下。如果您想要做的是清除打开的浏览器窗口,则需要实现一个基于剩余时间的计时器,以在会话过期前进行清理。
登录和登出涉及添加或删除 cookie 或令牌以身份验证外部服务。您看到的调用应该在登录控制器中,不应移动到 global.asax 中。
不需要采取其他措施。

1
请将以下配置中的两个超时时间设置为确切的分钟数。确保将slidingExpiration设置为true,这意味着在每个请求之后身份验证将继续延长30分钟,就像会话在每个请求之后继续延长一样。
<authentication mode="Forms">
  <forms loginUrl="~/Auth/SignOn.aspx" timeout="30" slidingExpiration="true" />
</authentication>

<sessionState timeout="30" />

代码使用ApplicationCookie,如下所示应用程序启动后是否有更改ExpireTimeSpan的方法?这取决于用户登录的身份,我想设置超时时间。app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, AuthenticationMode = AuthenticationMode.Active, LoginPath = new PathString("/Account/Login") ExpireTimeSpan = TimeSpan.FromSeconds(5) }); - TheWommies

1
我认为将会话和身份验证cookie 同步是错误的做法。会话和cookie 是不同的事情。你可以在同一会话期间使用多个用户进行登录。当你打开某个 URL 时,会启动一个新会话,并在关闭窗口或在服务器端过期时结束。有关会话 - 身份验证 cookie 关系的更多信息,请阅读以下答案:asp.net cookies, authentication and session timeouts 无论如何,如果你想这样做,你可以使用一个小技巧。你需要定期使用 ajax 调用来调用你的服务器,例如每 n 秒调用 YourWebsite.com/chcecksession 页面。在那里,你必须检查会话变量是否存在。如果它不再存在,则只需调用 FormsAuthentication.SignOut(),刷新你的页面,用户将被注销。

使用声明来添加有关用户的更多信息,而不是使用cookie,这是否有什么问题? - TheWommies
@TheWommies的声明旨在存储与用户相关的信息,因此使用它们是可以的。 - Marian Ban
谢谢,只是好奇,定期轮询服务器不会重置会话超时吗?因此,如果用户处于非活动状态,会话将永远不会过期,而我希望它过期。 - TheWommies
@TheWommies 是的,它会在每个请求后重置会话超时时间,但您不能依赖此功能,因为当应用程序池重新启动或更改web.config时,会话也会过期。 - Marian Ban

1
我对你的WCF实现不太确定,因为我对WCF不是很熟悉。我正在构建一个大型的奖学金申请程序,我们想要限制每个用户只能登录一次。我已经设置了一个表来跟踪userID和GUID,将其存储在他们的Auth Cookie中。您可以使用会话ID代替。我将缓存该表并在添加或删除条目时刷新缓存。我正在使用SignalR(您可以从NuGet包获取)来与每个客户端保持连接。当他们关闭浏览器时,SignalR可以立即报告用户已经离开,我可以终止他们在会话跟踪表中的记录。在您的情况下,您可以终止会话。此外,如果用户尝试重新登录,我可以看到他们已经登录。然后我终止他们的原始会话并允许他们重新登录。
花了几个小时才习惯使用SignalR,我强烈推荐Plural Sight上的视频。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接