IdentityServer4访问令牌生存期

时间:2018-05-16 06:02:45

标签: access-token identityserver4

我使用的是IdentityServer4,其配置在数据库中。客户端(oidc)会进行无声续订。我为客户设置了以下生命周期设置:

AbsoluteRefreshTokenLifetime =  60 * 30,//30 mins
AccessTokenLifetime = 60 * 5,//5 mins
SlidingRefreshTokenLifetime = 60 * 15 // 15 mins

应该怎么办?令牌的有效期应该是多长时间?应该何时要求用户再次登录?没有关于令牌生命周期刷新时及其过期时的明确文档。

2 个答案:

答案 0 :(得分:6)

  

访问令牌有两种形式 - 自包含或参考。

     

JWT令牌将是一个自包含的访问令牌 - 它是受保护的   具有索赔和到期的数据结构。一旦API学会了   关于关键材料,它可以验证自包含的令牌   需要与发行人沟通。这使得JWT很难   撤消。它们将一直有效,直到它们过期。

来自http://docs.identityserver.io/en/latest/topics/reference_tokens.html#reference-tokens

  

刷新令牌可以获得对API的长期访问。

     

您通常希望将访问令牌的生命周期保持为最短   可能,但同时不想打扰用户和   再做一次前向通道往返于IdentityServer for   请求新的。

     

刷新令牌允许在没有用户的情况下请求新的访问令牌   相互作用。每次客户端刷新它需要做的令牌   对IdentityServer的(经过身份验证的)后向通道调用。这允许   检查刷新令牌是否仍然有效,或者是否已被撤销   与此同时。

来自http://docs.identityserver.io/en/latest/topics/grant_types.html#refresh-tokens

因此,访问令牌是自包含的,这意味着它无法被修改。一旦发出,令牌将保持有效直至其到期。这就是为什么你想要使用短期令牌。

为了自动执行访问令牌续订过程,您可以使用刷新令牌。这是一个强大的令牌,因为它可用于在没有用户交互的情况下请求访问令牌。刷新令牌应该是长期存在的(至少比访问令牌长)。

刷新令牌到期后,用户必须再次登录。如果没有滑动过期,刷新令牌将在绝对时间内到期,让用户再次登录。

使用滑动到期时,您可以设置更短的刷新令牌生命周期。因为每次请求访问令牌时,都会发出新的刷新令牌。延长生命周期并使用过的刷新令牌无效。

只要刷新令牌有效,用户就可以访问资源而无需再次登录。在您的情况下,如果用户处于非活动状态超过30分钟,它将过期。

访问令牌不会自动刷新。您需要在客户端中添加代码以请求新的访问令牌。如果刷新令牌不可用或已过期,您可以将用户发送到登录页面。

答案 1 :(得分:1)

根据我的理解,AbsoluteRefreshTokenLifetime和SlidingRefreshTokenLifetime不适用于隐式流,这是oidc客户端应该设置为:

http://docs.identityserver.io/en/release/topics/refresh_tokens.html

  

由于访问令牌的生命周期有限,因此刷新令牌允许在没有用户交互的情况下请求新的访问令牌。

     

以下流程支持刷新令牌:授权代码,混合和资源所有者密码凭据流。需要明确授权客户端通过将AllowOfflineAccess设置为true来请求刷新令牌

我有类似的情况发生在测试中,我将cookie设置为15分钟到期,滑动到期,并且根据下面的问题线程,如果使用静默更新,必须手动处理这些声音:

https://github.com/IdentityModel/oidc-client-js/issues/402

我是javascript客户的新手,所以我仍然在试图弄清楚你是如何确定用户的。我希望cookie会为我处理这个问题,但看起来它会根据我发送的那个帖子不断扩展。

<强>更新

经过测试和大量的谷歌搜索是我能够在访问令牌生命周期和无声续订方面的工作/理解。

首先我假设您使用的是oidc-client或redux-oidc。我使用的是redux-oidc,它只是oidc-client的包装器。

由于您将访问令牌生存期(AccessTokenLifetime)设置为5分钟并且具有无提示更新= true。这将每2.5分钟更新一次,或者取决于您将userManager.accessTokenExpiringNotificationTime设置为的内容。此时,它将根据您的Cookie到期超时设置为更新来更新访问令牌。 cookie是魔术发生的地方。如果cookie过期,您将无法再续订访问令牌。 cookie的设置如下:

  • Identity Server start.cs(这将设置cookie的滑动到期时间):

    var builder = services.AddIdentityServer(options =&gt; {    options.Authentication.CookieSlidingExpiration = true; })

  • Identity Server AccountController.cs,登录方法(如果您记得我的功能,您可以更改IsPersistent值,tsConfigValue = 15):

    var props = new AuthenticationProperties  {     IsPersistent = false,     ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(tsConfigValue))  };

这最终解决了我的访问令牌生存期和无声续订问题。希望它有所帮助。