我的网站是一个AngularJS SPA,在Owin上运行Web API/SignalR后端。 身份验证使用存储在浏览器本地存储中的 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"
});
HTTP非常可靠和简单的方法是为此制作endoint并检查它,即每秒一次:
module.run(($interval) = > {
$interval(() => {
$http.get('/checkToken').then((result) => {
if (result.data.expired) {...}
}, (error) => ...)
}, 1000);
})
在端点checkToken
服务器上,您可以执行所有需要的检查。
为了更好的实时客户端-服务器交互,您可以考虑使用套接字,但这是另一回事。
我对 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);