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/
リフレッシュトークンを保存し、アクセストークンを生成することを確認するために新しいテーブル(refreshToken)を作成しましたが、正常に動作しますが、同じシナリオを処理するために既存のAspNetUserTokensテーブルを使用できるかどうか確認したかったです。 AspNetUserTokensテーブルは確認メール、パスワードを忘れたなどに使用されることを理解しています.
私の質問は次のとおりです:誰かがAspNetUserTokensを使用してrefreshtokenを保存している場合、usermanagerクラスは直接トークンモデル(AspNetUserTokens)を公開せず、 IdentityDbContextを使用していますが、長所と短所は何ですか? IdentityDbContextを実装しましたが、Microsoft.AspNetCore.Identityの組み込みクラスがAspNetUserTokensにトークンを保存することはありません
いくつかのガイダンスに非常に感謝します。
ありがとうございました
あなたの質問に直接答えてから、代替案を提案します。 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);