我的网站是一个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"
});
答案 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);