İstediğini tamamen başarabilirsin:
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();
});
Kodunuz ile bunun arasındaki farkları gözden geçirelim.
AddAuthentication parametresi yok
Varsayılan bir kimlik doğrulama şeması ayarlarsanız, her bir istekte kimlik doğrulama ara yazılımı, varsayılan kimlik doğrulama şemasıyla ilişkili kimlik doğrulama işleyicisini çalıştırmayı deneyecektir. Artık iki opssible kimlik doğrulama şemasına sahip olduğumuz için, bunlardan birini çalıştırmanın bir anlamı yok.
Başka bir aşırı yükleme kullanın AddJwtBearer
AddXXXBir kimlik doğrulama eklemek için her bir yöntemin birkaç aşırı yüklemesi vardır:
Şimdi, aynı kimlik doğrulama yöntemini iki kez kullandığınızdan, ancak kimlik doğrulama şemalarının benzersiz olması gerektiğinden, ikinci aşırı yüklemeyi kullanmanız gerekir.
Varsayılan politikayı güncelleyin
İstekler artık otomatik olarak doğrulanmayacağından [Authorize], bazı eylemlere öznitelikler koymak , isteklerin reddedilmesine neden olacak ve bir HTTP 401verilecektir.
Biz doğrulama işleyicileri isteği doğrulamak için bir şans vermek istiyoruz, çünkü bizim istediğimiz olmadığı için, biz de belirterek yetkilendirme sisteminin varsayılan politikasını değiştirmesi Firebaseve Customkimlik doğrulama düzenleri edilmelidir çalıştı isteği doğrulamak için.
Bu, bazı eylemlerde daha kısıtlayıcı olmanızı engellemez; [Authorize]özniteliği vardır AuthenticationSchemessen şemaları geçerli olan kimlik doğrulama geçersiz kılmak için izin verir özelliği.
Daha karmaşık senaryolarınız varsa, ilke tabanlı yetkilendirmeden yararlanabilirsiniz . Resmi belgelerin harika olduğunu düşünüyorum.
Bazı işlemlerin yalnızca Firebase tarafından verilen JWT jetonları için geçerli olduğunu ve belirli bir değere sahip bir hak talebinin olması gerektiğini varsayalım; bunu şu şekilde yapabilirsin:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
Daha sonra [Authorize(Policy = "FirebaseAdministrators")]bazı eylemlerde kullanabilirsiniz .
Unutulmaması gereken son bir nokta: AuthenticationFailedOlayları yakalıyorsanız ve ilk AddJwtBearerpolitikadan başka herhangi bir şey kullanıyorsanız , IDX10501: Signature validation failed. Unable to match key...bunun nedeni sistemin AddJwtBearerbir eşleşme elde edene kadar her birini sırayla kontrol etmesi olduğunu görebilirsiniz . Hata genellikle göz ardı edilebilir.