Puoi ottenere totalmente ciò che desideri:
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();
});
Esaminiamo le differenze tra il tuo codice e quello.
AddAuthentication
non ha parametri
Se si imposta uno schema di autenticazione predefinito, ad ogni singola richiesta il middleware di autenticazione tenterà di eseguire il gestore di autenticazione associato allo schema di autenticazione predefinito. Poiché ora abbiamo due schemi di autenticazione utilizzabili, non ha senso eseguirne uno.
Usa un altro sovraccarico di AddJwtBearer
Ogni singolo AddXXX
metodo per aggiungere un'autenticazione ha diversi overload:
Ora, poiché usi lo stesso metodo di autenticazione due volte ma gli schemi di autenticazione devono essere univoci, devi usare il secondo overload.
Aggiorna il criterio predefinito
Poiché le richieste non verranno più autenticate automaticamente, l'inserimento di [Authorize]
attributi in alcune azioni comporterà il rifiuto delle richieste e HTTP 401
verrà emesso un messaggio.
Dal momento che non è quello che vogliamo perché vogliamo dare ai gestori la possibilità di autenticazione per autenticare la richiesta, si cambia la politica di default del sistema di autorizzazione, indicando sia le Firebase
e Custom
autenticazione schemi deve essere provato per autenticare la richiesta.
Ciò non ti impedisce di essere più restrittivo su alcune azioni; l' [Authorize]
attributo ha una AuthenticationSchemes
proprietà che consente di sovrascrivere gli schemi di autenticazione validi.
Se hai scenari più complessi, puoi utilizzare l' autorizzazione basata su criteri . Trovo che la documentazione ufficiale sia ottima.
Immaginiamo che alcune azioni siano disponibili solo per i token JWT emessi da Firebase e debbano avere una dichiarazione con un valore specifico; potresti farlo in questo modo:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
È quindi possibile utilizzare [Authorize(Policy = "FirebaseAdministrators")]
su alcune azioni.
Un ultimo punto da notare: se stai catturando AuthenticationFailed
eventi e usando qualcosa tranne il primo AddJwtBearer
criterio, potresti vedere IDX10501: Signature validation failed. Unable to match key...
Ciò è causato dal sistema che controlla ciascuno AddJwtBearer
a turno fino a quando non ottiene una corrispondenza. L'errore di solito può essere ignorato.