有没有办法从Identity Server中的客户端续订IDP会话令牌

时间:2016-09-21 23:09:12

标签: oauth-2.0 identityserver3 openid-connect

我正在使用Identity Server为我公司的应用程序实现单点登录/注销。是否有任何方法可以使客户的cookie更新(通过Sliding Expiration),也会转到IDP并更新其会话cookie上的过期时间?目标是即使在IDP会话过期后,也可以在所有应用中共享1小时的共享滑动到期时间。

我现在想到实现这一目标的唯一方法是创建一些中间件来检查客户端上的cookie,如果它即将到期,那么添加一个iframe来调用IDP上的端点来告诉它还要更新它的cookie。我是在正确的轨道上吗?是否有这样的机制内置到Identity Server中,如果有,那么端点是什么?

为了清晰起见进行编辑:

问题

  • 前往客户A @ 10:00
    • 重定向到IDP并登录
    • 重定向回客户端
      • 现在有一个关于客户A和IDP的会议,直到10:10
    • 在客户端A保持活跃,直至10:15,然后转到客户B
    • 用户必须再次登录,因为客户端A网站已将其Cookie保持活动但IDP已过期 - 这是我希望客户端A在其上调用幻灯片的位置IDP保持其会话与任何客户端一起处于活动状态,我可以在不登录的情况下转到客户端B

2 个答案:

答案 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)

是的,您可以请求刷新令牌,然后使用它来获取新的访问令牌。

相关问题