当浏览器或选项卡关闭时,杀死Asp.Net会话

时间:2012-02-20 09:17:58

标签: asp.net forms-authentication webforms

我正在使用Asp.Net 4进行表单身份验证。当用户单击注销链接时,我清除会话并调用FormsAuthentication.SignOut(),这可以防止用户在没有记录的情况下返回站点再次。

现在我想在关闭浏览器或标签时终止会话。我尝试通过处理onbeforeunload事件来做到这一点,但是在点击任何内部链接后我最终终止了会话。

我有什么想法可以做到这一点吗?

4 个答案:

答案 0 :(得分:2)

You can't,但您可以come close to

答案 1 :(得分:1)

身份验证Cookie 仅限会话,表示浏览器关闭时浏览器删除。也许您没有关闭所有浏览器选项卡,但如果您关闭它们,则所有身份验证cookie都将丢失。

关于关闭标签页,您不知道用户是否打开了其他标签页。

可能的解决方案可能是每10秒钟回拨一次呼叫以保持此身份验证的活动与否,并将身份验证设置为在20秒后结束。因此,如果没有任何信号回来,用户就会离开。这可以使用javascript完成。另一方面,这不能让用户在几分钟不活动后退出,因此您可能需要将此逻辑与其他内容相结合。

答案 2 :(得分:0)

您可以做的最好的事情是当您的用户明确注销时也会调用Session.Abandon()来删除该用户的会话。但正如其他人所说,没有办法知道标签/窗口是否只是以这种方式退出而没有注销。会话将在服务器上闲逛,直到它过期。

答案 3 :(得分:0)

我回答了另一个问题,当用户在实际网站上编辑web.config时,会话被杀死了。他们正在跟踪仍然使用会话变量登录的用户(危险)。但想出了一个可以帮助这里的人的解决方案(未经测试的解决方案)。

FormsAuthentication允许您维持一个人处于活动状态并无限期登录。但如果它们变得不活跃,例如他们将退出20分钟,这很好。但是要在关闭浏览器时将它们注销(等待它......),因为将超时值设置为0会导致它们不断登录然后再出来。

解决方案:当您使用FormsAuthentication登录某人时,您还可以设置一个标准会话变量cookie,当它们关闭浏览器时将被删除。此cookie将具有非标识的非帐户相关信息。只是一个简单的" loggedIn:yes"。

现在你的所有代码都需要拥有它的主页/ materlayout是页面循环中的高级调用或页面循环的构造函数(甚至是自定义属性),它将检查cookie和用户同一性:

if(!HasLoginCookie() || !System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
   // redirect user to log in page.
}

基本上,如果在浏览器关闭时删除了cookie,您将把用户重定向到登录页面。

希望这有助于(并且有效。正如我所说的那样未经测试)。