【问题标题】:When using a HTTP-only session cookie, how does the client know when its session is going to expire?当使用仅 HTTP 会话 cookie 时,客户端如何知道其会话何时到期?
【发布时间】:2018-10-12 18:51:44
【问题描述】:

我的网站是一个 AngularJS SPA,其 Web API/SignalR 后端在 Owin 上运行。身份验证通过存储在浏览器本地存储中的 JSON Web 令牌 (JWT) 进行管理。

根据公司指令,我将从本地存储中的 JWT 转移到具有滑动到期时间的仅 HTTP 同站点会话 cookie。一切都很好,除了一个障碍:

我的应用程序显示个人健康信息 (PHI),因此我必须在会话到期后立即自动关闭应用程序。使用 JWT,我可以检查“exp”声明以自动确定会话已过期并从屏幕上删除 PHI。但是使用仅限 HTTP 的 cookie,我无法访问令牌的任何部分。

当我发出 cookie 时,我知道过期时间并可以相应地通知浏览器。但是,当 Owin 刷新 cookie 时,需要通知浏览器新的过期时间,我不知道该怎么做。

我可以存储第二个不是仅 HTTP 的 cookie,它只包含会话到期时间,但是每当我刷新我的主要身份验证 cookie 时,我都必须刷新那个 cookie。

我如何告诉浏览器会话何时到期,并在到期更改时保持浏览器更新?如何在 Owin 刷新 cookie 时附加事件处理程序?

这是我当前的 cookie 配置:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    AuthenticationMode = AuthenticationMode.Active,
    CookieHttpOnly = true,
    ExpireTimeSpan = TimeSpan.FromHours(2),
    SlidingExpiration = true,
    CookieName = "Auth"                
});

【问题讨论】:

    标签: c# angularjs cookies owin session-cookies


    【解决方案1】:

    我对 Angular 或 Owin 不是很熟悉,但在处理受法律保护的教育数据时,我们通过减少秒数来解决它,然后在 AJAX 调用完成后在处理程序中重置。

    一个简单的版本看起来像这样:

    var Countdown = {};
    var Countdown.length = 3600 /* your session timeout here */;
    var Countdown.seconds = Countdown.length;
    
    var Countdown.tick = function() {
        Countdown.seconds--;
        if (Countdown.seconds == 0) {
             /* handle timeout */
        }
        /* any additional processing code here */
    }
    
    var Countdown.reset = function() { 
        Countdown.seconds = Countdown.length;
        /* any additional processing code here */
    }
    
    window.setInterval(Countdown.tick, 1000);
    

    【讨论】:

    • 这里不考虑cookie的更新。
    • setInterval 不是精确的倒计时。您最好获取日期,并计算到期时间,并且每秒(或者您甚至可以优化以使用 max(timeLeft / 2, 1000) 执行 setTimeout)检查到期时间是否已过。
    【解决方案2】:

    使用 HTTP 的相当可靠和简单的方法是为此创建 endoint 并检查它,即每秒一次:

    module.run(($interval) = > {
      $interval(() => {
          $http.get('/checkToken').then((result) => {
            if (result.data.expired) {...}
          }, (error) => ...)
      }, 1000);
    })
    

    checkToken 端点的服务器上,您可以执行所有需要的检查。

    为了更好的实时客户端-服务器交互,您可以考虑使用套接字,但这是另一回事。

    【讨论】:

    • 这不会导致 auth cookie 被更新吗?
    • 嗯,这取决于你如何在 BE 上实现它。
    猜你喜欢
    • 2020-07-07
    • 2010-11-17
    • 2023-04-02
    • 2017-04-19
    • 2017-05-31
    • 2015-03-31
    • 1970-01-01
    • 2018-05-03
    • 2010-11-26
    相关资源
    最近更新 更多