我正在使用Asp.Net 4进行表单身份验证。当用户单击注销链接时,我清除会话并调用FormsAuthentication.SignOut()
,这可以防止用户在没有记录的情况下返回站点再次。
现在我想在关闭浏览器或标签时终止会话。我尝试通过处理onbeforeunload
事件来做到这一点,但是在点击任何内部链接后我最终终止了会话。
我有什么想法可以做到这一点吗?
答案 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,您将把用户重定向到登录页面。
希望这有助于(并且有效。正如我所说的那样未经测试)。