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

Oauth 2.0 有没有办法从Identity Server中的客户端续订IDP会话令牌,oauth-2.0,identityserver3,openid-connect,Oauth 2.0,Identityserver3,Openid Connect,我正在使用Identity Server实现公司应用程序的单点登录/注销。是否有任何方法可以使客户端的cookie在续订(通过滑动过期)时也转到IDP并在it会话cookie上续订过期时间?目标是能够在所有应用程序之间共享1小时滑动过期,即使在IDP会话应该过期之后也是如此 我现在能想到的实现这一点的唯一方法是创建一些中间件来检查客户端上的cookie,如果cookie即将过期,那么添加一个iframe来调用IDP上的端点,告诉它也更新cookie。我走对了吗?Identity Server中是

我正在使用Identity Server实现公司应用程序的单点登录/注销。是否有任何方法可以使客户端的cookie在续订(通过滑动过期)时也转到IDP并在it会话cookie上续订过期时间?目标是能够在所有应用程序之间共享1小时滑动过期,即使在IDP会话应该过期之后也是如此

我现在能想到的实现这一点的唯一方法是创建一些中间件来检查客户端上的cookie,如果cookie即将过期,那么添加一个iframe来调用IDP上的端点,告诉它也更新cookie。我走对了吗?Identity Server中是否内置了类似的机制?如果是,端点是什么

为清晰起见进行编辑:

问题
  • 10:00前往客户A
    • 重定向到IDP并登录
    • 重定向回客户端
      • 现在在客户端a和IDP上进行会话,直到10:10
    • 在客户端A上保持活动直到10:15,然后转到客户端B
    • 用户必须再次登录,因为客户端A站点已使其cookie保持活动状态,但IDP已过期-这是我希望客户端A调用IDP上的幻灯片以使其会话与任何客户端保持活动状态的地方,这样我就可以转到客户端B而无需再次登录

是的,您可以请求一个刷新令牌,然后使用该令牌获得一个新的访问令牌。

我的情况与
@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);
                });
            });
        });
   }
}
公共类启动
{
//...
公共无效配置(IAppBuilder应用程序)
{ 
//...
app.Map(“/identity”,appBuilder=>
{
var idSrvOptions=新标识服务器选项
{/*此处的IdSrv配置选项*/};
appBuilder.UseIdentityServer(idSrvOptions);
appBuilder.Map(“/slide”,identityAppBuilder=>
{
identityAppBuilder.Run(异步上下文=>
{
var cookie=context.Environment.ResolveDependency();
cookie.ClearSessionId();
cookie.IssueSessionId(空);
等待任务。从结果(0);
});
});
});
}
}
从客户端/依赖方我有以下JavaScript(它只是在html主体中放置一个不可见的图像,如果用户处于活动状态,则每X分钟刷新一次src-这将滑动STS的cookie,而不必担心iFrame)。这可以放在中间件中,自动将其注入包含
标记的所有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;
        }
    }
})()
(函数(){
这个.cookieDuration=10000;
this.lastAction=新日期();
this.img=document.createElement('img');
this.img.src=https://myStsDomain.com/identity/slide';
this.img.setAttribute('style','display:none');
文件.正文.附件(img);
设置时间间隔(刷新时间间隔,cookieDuration*.5);
document.addEventListener('click',
函数(){
if(IsLaStationLessThanCookieDuration()){
lastAction=新日期();
}
});
函数IsLaStationLessThanCookieDuration(){
返回(新日期()-lastAction)
据我所知,刷新令牌将允许客户端在IDP会话过期后保持对API的访问。我需要用户能够在IDP会话cookie过期后(例如,在默认的10小时后)转到另一个客户端,并再次登录,而不需要输入凭据。因此,当一个客户端的本地会话cookie被刷新时,它也会刷新IDP上的会话cookie。用户必须再次登录。@BrockAllen那么IDSrv上cookie选项中SlidingExpiration字段的用途是什么?如何制作这张过期“幻灯片”?