如何在会话超时或结束时注销用户

Posted

技术标签:

【中文标题】如何在会话超时或结束时注销用户【英文标题】:How to log out a user when a session times out or ends 【发布时间】:2011-05-23 18:27:06 【问题描述】:

当会话结束或到期时注销用户的最佳方式是什么?

感谢您的帮助。

【问题讨论】:

您的意思是让用户变得未经身份验证,还是实际上将用户重定向到“嘿,你超时了!”等待太久且会话已过期后的页面? 当会话结束时,他们发出的下一个请求将是未经身份验证的。在这种情况下,您的页面可以在加载新页面时进行检查。如果它们在同一页面上停留的时间过长,要重定向它们,您需要将 javascript 写入具有等于会话超时值的倒计时计时器的页面。当计时器达到零重定向时,因为会话无效。 (有点 - 一个警告是,如果他们在另一个选项卡中浏览您的网站 - 这将使会话保持活动状态,而第一个选项卡 javascript 仍将倒计时) 【参考方案1】:

这实际上取决于您正在寻找的所需功能。我假设您使用的是 FormsAuthentication。

您需要关注两件不同的事情:SessionFormsAuthentication cookie。除非我弄错了,否则这两个都有单独的超时。

如果您遇到的问题是会话超时但用户仍然通过身份验证,您可以尝试以下组合:

1:确保身份验证cookie与会话具有相同的超时值:

<authentication mode="Forms"><forms ... timeout="20" ... ><authentication>
<sessionState ... timeout="20" ... />

2:在您的 Page_Load 事件中,检查会话是否超时:

if (context.Session != null && Context.Session.IsNewSession == true &&
    Page.Request.Headers["Cookie"] != null &&
    Page.Request.Headers["Cookie"].IndexOf("ASP.NET_SessionId") >= 0)

    // session has timed out, log out the user
    if (Page.Request.IsAuthenticated)
    
        FormsAuthentication.SignOut();
    
    // redirect to timeout page
    Page.Response.Redirect("/Timeout.aspx");

(有关检测会话超时的信息,请参阅http://www.eggheadcafe.com/articles/20051228.asp)

如果您想要更愉快的用户体验,您可以使用 javascript 在 X 分钟后启动某种模式 UI 弹出窗口。这个弹出窗口只允许用户启动一个按钮单击,这将触发服务器上的 AJAX 回发,从而扩展他们的身份验证和会话 cookie,而无需重新加载页面。我以前从未实现过,但请看, this guy made an ASP.NET AJAX control !

【讨论】:

【参考方案2】:

如果您使用的是 .net Membership Provider,只需在 web.config 中设置超时设置 http://msdn.microsoft.com/en-us/library/h6bb9cz9(v=VS.100).aspx

【讨论】:

以上是关于如何在会话超时或结束时注销用户的主要内容,如果未能解决你的问题,请参考以下文章

如何结束用户会话令牌并刷新令牌,时间超过 25 分钟

在春季安全中注销特定会话ID

如何将Google Analytics会话与应用会话统一?

如何显示足够智能以处理多个打开的浏览器或选项卡的会话超时警告

如何记录 tomcat 会话失效或用户注销

如何在django中设置会话超时?