Możesz całkowicie osiągnąć to, czego chcesz:
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();
});
Przyjrzyjmy się różnicom między twoim kodem a tym.
AddAuthentication nie ma parametru
Jeśli ustawisz domyślny schemat uwierzytelniania, przy każdym żądaniu oprogramowanie pośredniczące uwierzytelniania spróbuje uruchomić procedurę obsługi uwierzytelniania skojarzoną z domyślnym schematem uwierzytelniania. Ponieważ mamy teraz dwa możliwe schematy uwierzytelniania, nie ma sensu uruchamiać jednego z nich.
Użyj innego przeciążenia AddJwtBearer
Każda AddXXXmetoda dodawania uwierzytelniania ma kilka przeciążeń:
Teraz, ponieważ dwukrotnie używasz tej samej metody uwierzytelniania, ale schematy uwierzytelniania muszą być unikatowe, musisz użyć drugiego przeciążenia.
Zaktualizuj zasady domyślne
Ponieważ żądania nie będą już automatycznie uwierzytelniane, nadanie [Authorize]atrybutów niektórym akcjom spowoduje odrzucenie żądań i wystawienie HTTP 401ich.
Ponieważ nie jest to, co chcemy, ponieważ chcemy dać przewodnicy uwierzytelnianie szansę uwierzytelnienia żądania, możemy zmienić domyślną politykę autoryzacji systemu, wskazując zarówno Firebasei Customuwierzytelniania schematy powinny być próbował uwierzytelnić prośbę.
To nie przeszkadza ci być bardziej restrykcyjnymi w niektórych działaniach; [Authorize]atrybut ma AuthenticationSchemeswłaściwość, która pozwala zastąpić systemy uwierzytelniania, które są ważne.
Jeśli masz bardziej złożone scenariusze, możesz skorzystać z autoryzacji opartej na zasadach . Uważam, że oficjalna dokumentacja jest świetna.
Wyobraźmy sobie, że niektóre akcje są dostępne tylko dla tokenów JWT wydanych przez Firebase i muszą mieć roszczenie o określonej wartości; możesz to zrobić w ten sposób:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
Możesz następnie użyć [Authorize(Policy = "FirebaseAdministrators")]do niektórych działań.
Ostatnia uwaga: jeśli przechwytujesz AuthenticationFailedzdarzenia i używasz czegoś innego niż pierwsza AddJwtBearerzasada, możesz zobaczyć. IDX10501: Signature validation failed. Unable to match key...Jest to spowodowane tym, że system sprawdza każdą AddJwtBearerz nich po kolei, aż uzyska dopasowanie. Błąd można zwykle zignorować.