あなたは完全にあなたが望むものを達成することができます:
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 =>
{
});
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トークンでのみ使用可能であり、特定の値を持つクレームが必要であると想像してみてください。あなたはこのようにそれを行うことができます:
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
が一致するまで順番にチェックすることが原因であることがわかります。通常、エラーは無視できます。