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 AddXXX
metoda 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 401
ich.
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 Firebase
i Custom
uwierzytelniania schematy powinny być próbował uwierzytelnić prośbę.
To nie przeszkadza ci być bardziej restrykcyjnymi w niektórych działaniach; [Authorize]
atrybut ma AuthenticationSchemes
wł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 AuthenticationFailed
zdarzenia i używasz czegoś innego niż pierwsza AddJwtBearer
zasada, możesz zobaczyć. IDX10501: Signature validation failed. Unable to match key...
Jest to spowodowane tym, że system sprawdza każdą AddJwtBearer
z nich po kolei, aż uzyska dopasowanie. Błąd można zwykle zignorować.