【问题标题】:Kill Asp.Net session when the browser or tab is closed关闭浏览器或选项卡时终止 Asp.Net 会话
【发布时间】:2012-02-20 09:17:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net forms-authentication webforms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      关于关闭一个标签,你不知道用户是否打开了其他标签。

      一种可能的解决方案可能是每 10 秒调用一次服务器,以保持此身份验证是否处于活动状态,并将身份验证设置为在 20 秒后结束。所以如果没有任何信号回来,用户已经走了。这可以使用 javascript 来完成。另一方面,这不能让用户在几分钟不活动后退出,因此您可能需要将此逻辑与其他逻辑相结合。

      【讨论】:

      • 使用 FormsAuthentication,您可以跨浏览器会话登录。这就是为什么您可以在 web.config 中设置一个超时值来说明您希望某人处于活动状态的时间。
      【解决方案3】:

      您可以做的最好的事情是当您的用户显式注销并调用Session.Abandon() 以删除该用户的会话时。但是就像其他人所说的那样,如果不以这种方式注销,就无法知道选项卡/窗口是否会关闭。会话将在服务器上闲逛直到过期。

      【讨论】:

        【解决方案4】:

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

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

        所以解决方案:当您使用 FormsAuthentication 登录一个人时,您还可以设置一个标准会话变量 cookie,当他们关闭浏览器时将删除该 cookie。此 cookie 将包含非识别性非帐户相关信息。只是一个简单的“loggedIn:yes”。

        现在您的所有代码都需要在其母版页/母版布局上进行页面循环或页面循环的构造函数(甚至是自定义属性)中的高级调用,以检查 cookie 和用户身份:

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 1970-01-01
          • 2018-12-09
          • 2015-04-23
          • 1970-01-01
          • 2012-02-24
          • 2013-11-03
          • 2019-05-13
          • 2016-01-06
          相关资源
          最近更新 更多