web-dev-qa-db-ja.com

AspNetUserTokensテーブルを使用して、ASP.NET Core Web APIに更新トークンを保存する

ASP.NET Core Web APIアプリケーションを使用しています。 ASP.NET Identity(データベーステーブルに組み込まれている)の上にJwtトークンベースの認証を実装しようとしています。

ユーザー登録、ログインなどのすべてのシナリオを実装しましたが、リフレッシュトークンフロー(アクセストークンの有効期限が切れる場合、クライアントはリフレッシュトークンを使用して置換されたアクセストークンを取得する必要があります)を実装しようとしています。リフレッシュトークンを保存する新しいテーブル(refreshToken)を作成しているので、アクセストークンで検証でき、新しいアクセストークンとリフレッシュトークンが生成されます

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/

リフレッシュトークンを保存し、アクセストークンを生成することを確認するために新しいテーブル(refreshToken)を作成しましたが、正常に動作しますが、同じシナリオを処理するために既存のAspNetUserTokensテーブルを使用できるかどうか確認したかったです。 AspNetUserTokensテーブルは確認メール、パスワードを忘れたなどに使用されることを理解しています.

私の質問は次のとおりです:誰かがAspNetUserTokensを使用してrefreshtokenを保存している場合、usermanagerクラスは直接トークンモデル(AspNetUserTokens)を公開せず、 IdentityDbContextを使用していますが、長所と短所は何ですか? IdentityDbContextを実装しましたが、Microsoft.AspNetCore.Identityの組み込みクラスがAspNetUserTokensにトークンを保存することはありません

いくつかのガイダンスに非常に感謝します。

ありがとうございました

13
Ankit Patel

あなたの質問に直接答えてから、代替案を提案します。 AspNetUserTokensテーブルを使用して、トークンを削除、設定、取得、および検証できます。ただし、おそらくデータベースをスキップできるため、以下で説明します。

UserManagerの次のメソッドが生成および保存します。

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

UserManagerの次のメソッドは、取得および検証します。

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

スタートアップでIdentityBuilderを使用して、このようなプロバイダーをセットアップする必要があります。

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

これらのトークンをデータベースに保存する代わりに、次を使用して、必要に応じてすべてのトークンを無効にすることができます。これはログアウトの一部として実行できます。

_userManager.UpdateSecurityStampAsync(user);
12
Chris Schoon