[解決済み] 複数のJWTベアラ認証の使用
質問
ASP.NET Core 2で複数のJWTトークン発行元をサポートすることは可能でしょうか? 外部サービスにAPIを提供したいのですが、FirebaseとカスタムJWTトークン発行者の2つのJWTトークンのソースを使用する必要があります。ASP.NET Coreでは、Bearer authスキームのJWT認証を設定することができますが、1つのAuthorityにのみ対応しています。
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
}
発行者やオーディエンスを複数設定することはできますが、Authorityを複数設定することはできません。
どうすればよいですか?
あなたの望みを完全に実現することができます。
services
.AddAuthentication()
.AddJwtBearer("Firebase", options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
})
.AddJwtBearer("Custom", options =>
{
// Configuration for your custom
// JWT tokens here
});
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
});
あなたのコードとそのコードの違いを見ていきましょう。
AddAuthentication
にはパラメータがありません。
デフォルトの認証スキームを設定すると、すべてのリクエストに対して、認証ミドルウェアはデフォルトの認証スキームに関連付けられた認証ハンドラを実行しようとします。現在、2つの可能な認証スキームがあるため、それらのうちの1つを実行することに意味はありません。
の別のオーバーロードを使用します。
AddJwtBearer
すべての
AddXXX
メソッドには、いくつかのオーバーロードがあります。
- 一つは、認証メソッドに関連付けられたデフォルトの認証スキームが使用されるもので、例えば クッキー認証についてはこちらをご覧ください。
- オプションの設定に加えて、認証スキームの名前を渡すもの。 このオーバーロードでは
さて、同じ認証方法を2回使用しますが、認証スキームは一意でなければならないため、2番目のオーバーロードを使用する必要があります。
デフォルトのポリシーを更新する
リクエストはもう自動的に認証されないので、デフォルトのポリシーに
[Authorize]
属性をつけると、リクエストが拒否され
HTTP 401
が発行されます。
認証ハンドラにリクエストを認証する機会を与えたいので、これは私たちが望むことではありません。
Firebase
と
Custom
認証スキームは
が試した
を試みる必要があります。
だからといって、いくつかのアクションをより制限的にすることを妨げるわけではありません。
[Authorize]
属性には
AuthenticationSchemes
プロパティがあり、どの認証スキームが有効かを上書きすることができます。
より複雑なシナリオを作成する場合は ポリシーベースの認証 . 私は、公式のドキュメントが素晴らしいと思っています。
Firebaseが発行したJWTトークンにしか利用できないアクションがあり、特定の値を持つクレームが必要だと想像してみましょう。このようにすることができます。
// Authentication code omitted for brevity
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
次に
[Authorize(Policy = "FirebaseAdministrators")]
を使うことができます。
最後の注意点として、もしあなたが
AuthenticationFailed
イベントをキャッチし、最初の
AddJwtBearer
ポリシーを使用している場合は
IDX10501: Signature validation failed. Unable to match key...
これは、システムがそれぞれの
AddJwtBearer
を順番にチェックするために起こります。このエラーは通常無視することができます。
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] IDisposable インターフェースの正しい使用法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】「namespace」なのに「type」のように使われる。