web-dev-qa-db-fra.com

Durée de vie du jeton d'accès IdentityServer4

J'utilise IdentityServer4 et sa configuration se trouve dans la base de données. Il y a un renouvellement silencieux sur le client (oidc). J'ai défini les paramètres de durée de vie suivants pour le client:

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

Que doit-il se passer? Quelle devrait être la durée de vie du jeton? Quand faut-il demander à l'utilisateur de se reconnecter? Il n'y a pas de documentation claire sur la durée de vie du jeton lorsqu'il est actualisé et lorsqu'il expire.

5
The Eagle

Les jetons d'accès peuvent être de deux types: autonomes ou de référence.

Un jeton JWT serait un jeton d'accès autonome - c'est une structure de données protégée avec des revendications et une expiration. Une fois qu'une API a pris connaissance du matériel clé, elle peut valider des jetons autonomes sans avoir à communiquer avec l'émetteur. Cela rend les JWT difficiles à révoquer. Ils resteront valables jusqu'à leur expiration.

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

Les jetons d'actualisation permettent d'obtenir un accès de longue durée aux API.

Vous voulez généralement garder la durée de vie des jetons d'accès aussi courte que possible, mais en même temps, vous ne voulez pas déranger l'utilisateur encore et encore en faisant des allers-retours sur le canal avant à IdentityServer pour en demander de nouveaux.

Les jetons d'actualisation permettent de demander de nouveaux jetons d'accès sans interaction de l'utilisateur. Chaque fois que le client actualise un jeton, il doit effectuer un appel de canal retour (authentifié) à IdentityServer. Cela permet de vérifier si le jeton d'actualisation est toujours valide ou a été révoqué entre-temps.

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

Le jeton d'accès est donc autonome, ce qui signifie qu'il ne peut pas être modifié. Une fois émis, le jeton reste valide jusqu'à son expiration. C'est pourquoi vous voudriez utiliser des jetons de courte durée.

Afin d'automatiser le processus de renouvellement du jeton d'accès, vous pouvez utiliser le jeton d'actualisation. Il s'agit d'un jeton puissant, car il peut être utilisé pour demander un jeton d'accès sans interaction avec l'utilisateur. Le jeton d'actualisation doit être de longue durée (au moins plus long que le jeton d'accès).

Une fois le jeton d'actualisation expiré, l'utilisateur doit se reconnecter. Sans expiration glissante, le jeton d'actualisation expirera dans un temps absolu, permettant à l'utilisateur de se reconnecter.

Avec l'expiration glissante, vous pouvez définir une durée de vie de jeton d'actualisation plus courte. Parce que chaque fois qu'un jeton d'accès est demandé, un nouveau jeton d'actualisation est émis. Prolonger la durée de vie et invalider le jeton d'actualisation utilisé.

L'utilisateur peut accéder à la ressource sans avoir à se reconnecter tant que le jeton d'actualisation est valide. Dans votre cas, il expire si l'utilisateur est inactif pendant plus de 30 minutes.

Le jeton d'accès n'est pas actualisé automatiquement. Vous devrez ajouter du code dans le client pour demander un nouveau jeton d'accès. Si le jeton d'actualisation n'est pas disponible ou a expiré, vous pouvez envoyer l'utilisateur à la page de connexion.

13
Ruard van Elburg

À ma connaissance, AbsoluteRefreshTokenLifetime et SlidingRefreshTokenLifetime ne s'appliquent pas au flux implicite, c'est-à-dire ce à quoi les clients oidc doivent être définis:

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

Étant donné que les jetons d'accès ont une durée de vie limitée, les jetons d'actualisation permettent de demander de nouveaux jetons d'accès sans interaction de l'utilisateur.

Les jetons d'actualisation sont pris en charge pour les flux suivants: code d'autorisation, flux d'informations d'identification du mot de passe du propriétaire de la ressource hybride et. Les clients doivent être explicitement autorisés à demander des jetons d'actualisation en définissant AllowOfflineAccess sur true

J'ai une situation similaire se produisant où, pour les tests, j'ai un cookie défini à une expiration de 15 minutes avec une expiration glissante et, selon le fil de discussion ci-dessous, cela doit être géré manuellement si vous utilisez le renouvellement silencieux:

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

Je suis nouveau sur les clients javascript, donc j'essaie toujours de comprendre comment vous déterminez si un utilisateur est présent ou non. J'espérais que le cookie s'en occuperait pour moi, mais il semble qu'il continue à être étendu par le fil que j'ai envoyé.

Mise à jour

Après des tests et une tonne de recherches sur Google, voici ce que j'ai pu apprendre/comprendre en ce qui concerne la durée de vie du jeton d'accès et le renouvellement silencieux.

Je suppose d'abord que vous utilisez oidc-client ou redux-oidc. J'utilise redux-oidc qui est juste un wrapper pour oidc-client.

Étant donné que la durée de vie du jeton d'accès (AccessTokenLifetime) est définie sur 5 minutes et que le renouvellement silencieux est vrai. Cela sera renouvelé toutes les 2,5 minutes ou en fonction de ce que vous avez défini sur userManager.accessTokenExpiringNotificationTime. À ce moment, il renouvellera le jeton d'accès en fonction de la durée d'expiration de votre cookie définie. Le cookie est l'endroit où la magie opère. Si le cookie expire, vous ne pourrez plus renouveler le jeton d'accès. le cookie est configuré comme suit:

  • Identity Server start.cs (cela définira l'expiration glissante du cookie):

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

  • Identity Server AccountController.cs, méthode de connexion (si vous avez une fonctionnalité de mémorisation, vous pouvez modifier la valeur IsPersistent, tsConfigValue = 15):

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

Cela a fini par résoudre mon problème avec la durée de vie du jeton d'accès et le renouvellement silencieux. J'espère que ça aide.

4
user1015196