2012-02-20 146 views
1

我正在使用ASP.Net 4的表单身份验证。当用户点击注销链接时,我清除会话并呼叫FormsAuthentication.SignOut(),这样可以防止用户无需再次登录即可返回网站。关闭浏览器或标签时关闭Asp.Net会话

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

任何想法,我可以做到这一点?

回答

1

认证cookie 仅会话,即浏览器关闭时通过浏览器删除。也许你不关闭所有的浏览器选项卡,但如果关闭它们,所有的身份验证cookie都将丢失。

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

一个可能的解决方案可能是每隔10秒向服务器发送一次呼叫以保持该认证是否激活,并将认证设置为在20秒后结束。所以如果没有任何信号回来,用户已经离开了。这可以使用JavaScript来完成。另一方面,这不能让用户在不活动几分钟后注销,因此您可能需要将此逻辑与其他内容结合使用。

+0

使用FormsAuthentication可以跨浏览器会话登录。这就是为什么您可以在网页中设置超时值。配置说你想让一个人活跃多久。 – 2014-07-25 22:05:33

0

您可以做的最好的事情是,当您的用户明确注销并呼叫Session.Abandon()以删除该用户的会话时。但是就像其他人所说的那样,没有办法知道标签/窗口是否以这种方式关闭而没有进行注销。会话将在服务器上停留,直到它到期。

0

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

FormsAuthentication允许您维护一个人处于活动状态并无限期登录。但是,如果它们对于例如20分钟他们将被注销,这是很好的。但是,当他们的浏览器不可能关闭时,让他们注销(等待它),因为将超时值设置为0会导致他们不断登录,然后再次出来。

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

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

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

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

希望有助于(和工作,正如我说的未经测试)。

相关问题