在其中一个WCF服务的ASP.NET MVC中,我将一个对象放入HttpContext.Current.Session对象。
当会话超时且会话被清除所有对象时,我想关闭用户,但一直无法找到方法。
在Global.asax
中调用Session_end方法时,Response对象和HttpContext.Current都为null。
非常感谢如何关闭用户的任何想法。
答案 0 :(得分:2)
当会话超时时,用户在任何情况下都不再存在。如果你要做的是清理打开的浏览器窗口,你需要根据会话到期前的剩余时间来实现一个计时器。
SignIn和signout与添加或删除Cookie或令牌以与外部服务进行身份验证有关。您看到的调用应该在登录控制器中,不应该移动到global.asax。
无需其他操作。
答案 1 :(得分:1)
我认为尝试保持会话和身份验证Cookie同步是错误的做法。会话和cookie是不同的东西。您可以在同一会话期间使用多个用户登录。当您打开某个URL时,您会启动一个新会话,当它关闭窗口时它会结束,或者它会在服务器端到期。有关会话 - 身份验证cookie关系的更多信息,请阅读以下答案:asp.net cookies, authentication and session timeouts
无论如何,如果你想这样做,你可以使用一个小技巧。您必须定期使用ajax调用呼叫您的服务器,例如每隔n秒调用YourWebsite.com/chcecksession页面。在那里你必须检查是否存在会话变量。如果它不再存在,那么只需调用FormsAuthentication.SignOut(),刷新页面,用户就会被注销。
答案 2 :(得分:1)
我不确定你是否植入了WCF,因为我不熟悉WCF。我目前正在构建一个大型奖学金申请,我们希望将登录限制为每个用户一次登录。我有一个表设置来跟踪用户ID和我存储在他们的Auth Cookie中的GUID。您可以使用会话ID。每次添加或删除条目时,我都会缓存表并刷新缓存。我正在使用SignalR(您可以获得NuGet包)来维护与我们每个客户的连接。当他们关闭浏览器时,SignalR可以立即报告用户已经离开,我可以从会话跟踪表中终止他们的记录。在你的情况下,你可以杀死会话。此外,如果用户尝试再次登录,我可以看到他们已经登录。然后我杀了他们原来的会话并允许他们登录新的。
花了几个小时才习惯使用SignalR,我强烈推荐Plural Sight上的视频。
答案 3 :(得分:1)
将以下配置中的两个超时设置为精确的分钟数。确保将slidingExpiration设置为true,这与每次请求后认证将继续延长至30分钟相同,因为会话在每次请求后继续扩展。
<authentication mode="Forms">
<forms loginUrl="~/Auth/SignOn.aspx" timeout="30" slidingExpiration="true" />
</authentication>
<sessionState timeout="30" />