使用仅HTTP会话cookie时,客户端如何知道其会话何时到期?

时间:2018-05-02 15:34:01

标签: c# angularjs cookies owin session-cookies

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

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

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

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

我可以存储第二个不仅仅是HTTP的cookie,只包含会话过期时间,但每当我刷新主要的auth cookie时,我都必须刷新该cookie。

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

这是我当前的cookie配置:

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

2 个答案:

答案 0 :(得分:0)

使用HTTP的相当可靠和简单的方法是为此制作端点并检查它,即每秒一次:

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

checkToken端点的服务器上,您可以完成所有需要的操作。

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

答案 1 :(得分:-2)

我并不熟悉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);