我正在使用Identity Server为我公司的应用程序实现单点登录/注销。是否有任何方法可以使客户的cookie更新(通过Sliding Expiration),也会转到IDP并更新其会话cookie上的过期时间?目标是即使在IDP会话过期后,也可以在所有应用中共享1小时的共享滑动到期时间。
我现在想到实现这一目标的唯一方法是创建一些中间件来检查客户端上的cookie,如果它即将到期,那么添加一个iframe来调用IDP上的端点来告诉它还要更新它的cookie。我是在正确的轨道上吗?是否有这样的机制内置到Identity Server中,如果有,那么端点是什么?
为了清晰起见进行编辑:
答案 0 :(得分:3)
我的情况与@Brock Allen
的答案解决的情况不同。由于我们在内部使用身份验证,因此我需要在用户浏览网站时保持 STS会话cookie 保持活动状态。这样,如果STS cookie在一小时后到期,但用户在任何客户端站点上活动> 1小时,则可以转到另一个客户端站点,而不必再次登录STS。
我已经用IDP上的以下代码解决了这个问题:
public class Startup
{
//...
public void Configuration(IAppBuilder app)
{
//...
app.Map("/identity", appBuilder =>
{
var idSrvOptions = new IdentityServerOptions
{ /* Your IdSrv config options here */ };
appBuilder.UseIdentityServer(idSrvOptions);
appBuilder.Map("/slide", identityAppBuilder =>
{
identityAppBuilder.Run(async context =>
{
var cookie = context.Environment.ResolveDependency<SessionCookie>();
cookie.ClearSessionId();
cookie.IssueSessionId(null);
await Task.FromResult(0);
});
});
});
}
}
来自客户端/依赖方我有以下JavaScript(它只是在html的主体中放置一个不可见的图像,并且如果用户处于活动状态,则每隔X分钟在src中刷新一次 - 这将滑动STS的cookie w / o不得不担心iframe)。这可以放在中间件中,将其自动注入包含<body>
标记的所有html响应中,或者只是添加到布局文件中:
(function () {
this.cookieDuration = 10000;
this.lastAction = new Date();
this.img = document.createElement('img');
this.img.src = 'https://myStsDomain.com/identity/slide';
this.img.setAttribute('style', 'display: none');
document.body.appendChild(img);
setInterval(refreshStsCookie, cookieDuration * .5);
document.addEventListener('click',
function() {
if (isLastActionLessThanCookieDuration()) {
lastAction = new Date();
}
});
function isLastActionLessThanCookieDuration() {
return (new Date() - lastAction) < cookieDuration;
}
function refreshStsCookie() {
if (isLastActionLessThanCookieDuration()) {
img.src = img.src;
}
}
})()
答案 1 :(得分:1)
是的,您可以请求刷新令牌,然后使用它来获取新的访问令牌。