web-dev-qa-db-fra.com

Utilisation de la table AspNetUserTokens pour stocker le jeton d'actualisation dans ASP.NET Core Web Api

Je travaille avec l'application ASP.NET Core Web API. J'essaie d'implémenter l'authentification basée sur les jetons Jwt au-dessus de l'identité ASP.NET (intégrée aux tables de base de données).

J'ai mis en œuvre tous les scénarios tels que l'enregistrement de l'utilisateur, la connexion, etc., mais j'essaie maintenant d'implémenter le flux de jeton d'actualisation (où le jeton d'accès expire, le client doit obtenir un jeton d'accès remplacé à l'aide du jeton d'actualisation). J'ai vu des gens créer une nouvelle table (refreshToken) pour stocker le jeton d'actualisation afin qu'il puisse être validé avec un jeton d'accès et de nouveaux jetons d'accès et d'actualisation seront générés

https://www.blinkingcaret.com/2018/05/30/refresh-tokens-in-asp-net-core-web-api/

https://www.c-sharpcorner.com/article/handle-refresh-token-using-asp-net-core-2-0-and-json-web-token/

J'ai créé une nouvelle table (refreshToken) pour stocker le jeton de rafraîchissement et le vérifier pour générer un jeton d'accès, cela fonctionne bien mais je voulais voir si je peux utiliser la table AspNetUserTokens existante pour gérer le même scénario. Je comprends que la table AspNetUserTokens est utilisée pour confirmer l'e-mail, le mot de passe oublié, etc.

Ma question est: si quelqu'un a utilisé AspNetUserTokens pour stocker refreshtoken, veuillez partager l'idée car la classe usermanager n'expose pas le modèle de jeton direct (AspNetUserTokens) et pas sûr si j'utilise IdentityDbContext, quels sont les prononciations et les inconvénients? J'ai implémenté IdentityDbContext mais je ne vois pas de classe intégrée dans Microsoft.AspNetCore.Identity pour stocker le jeton dans AspNetUserTokens

Serait très reconnaissant de quelques conseils.

Merci

13
Ankit Patel

Je répondrai directement à votre question puis proposerai une alternative. Vous pouvez supprimer, définir, obtenir et valider des jetons avec la table AspNetUserTokens. Cependant, vous pouvez probablement ignorer la base de données et je décrirai cela ci-dessous.

Les méthodes suivantes du UserManager vont générer et stocker:

await _userManager.RemoveAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
await _userManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);

Les méthodes suivantes du UserManager obtiendront et valideront:

var refreshToken = await _userManager.GetAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var isValid = await _userManager.VerifyUserTokenAsync(user, "MyApp", "RefreshToken", refreshToken );

Vous devrez configurer un fournisseur comme celui-ci à l'aide d'IdentityBuilder dans le démarrage.

identity.AddTokenProvider("MyApp", typeof(DataProtectorTokenProvider<User>)

Au lieu de stocker ces jetons dans la base de données, vous pouvez utiliser ce qui suit pour invalider tous les jetons selon les besoins. Vous pouvez le faire dans le cadre de la déconnexion.

_userManager.UpdateSecurityStampAsync(user);
12
Chris Schoon