İ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
AddXXX
Bir 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 401
verilecektir.
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 Firebase
ve Custom
kimlik 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 AuthenticationSchemes
sen ş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: AuthenticationFailed
Olayları yakalıyorsanız ve ilk AddJwtBearer
politikadan başka herhangi bir şey kullanıyorsanız , IDX10501: Signature validation failed. Unable to match key...
bunun nedeni sistemin AddJwtBearer
bir eşleşme elde edene kadar her birini sırayla kontrol etmesi olduğunu görebilirsiniz . Hata genellikle göz ardı edilebilir.