Sie können voll und ganz erreichen, was Sie wollen:
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();
});
Lassen Sie uns die Unterschiede zwischen Ihrem Code und diesem durchgehen.
AddAuthentication
hat keinen Parameter
Wenn Sie ein Standardauthentifizierungsschema festlegen, versucht die Authentifizierungs-Middleware bei jeder einzelnen Anforderung, den dem Standardauthentifizierungsschema zugeordneten Authentifizierungshandler auszuführen. Da wir jetzt zwei mögliche Authentifizierungsschemata haben, macht es keinen Sinn, eines davon auszuführen.
Verwenden Sie eine andere Überladung von AddJwtBearer
Jede einzelne AddXXX
Methode zum Hinzufügen einer Authentifizierung weist mehrere Überladungen auf:
Da Sie dieselbe Authentifizierungsmethode zweimal verwenden, die Authentifizierungsschemata jedoch eindeutig sein müssen, müssen Sie die zweite Überladung verwenden.
Aktualisieren Sie die Standardrichtlinie
Da die Anforderungen nicht mehr automatisch authentifiziert werden, werden beim Anlegen von [Authorize]
Attributen für einige Aktionen die Anforderungen abgelehnt und eine HTTP 401
ausgegeben.
Da das ist nicht das, was wir wollen , weil wir die Authentifizierungs - Handler eine Chance zu authentifizieren , die Anforderung geben wollen, müssen wir die Standardrichtlinie des Autorisierungssystems verändern sowohl die durch die Angabe Firebase
und Custom
sollte Systeme Authentifizierung werden versucht , die Anforderung zu authentifizieren.
Das hindert Sie nicht daran, einige Aktionen restriktiver zu gestalten. Das [Authorize]
Attribut verfügt über eine AuthenticationSchemes
Eigenschaft, mit der Sie überschreiben können, welche Authentifizierungsschemata gültig sind.
Wenn Sie komplexere Szenarien haben, können Sie die richtlinienbasierte Autorisierung verwenden . Ich finde die offizielle Dokumentation großartig.
Stellen wir uns vor, einige Aktionen stehen nur JWT-Token zur Verfügung, die von Firebase ausgestellt wurden, und müssen einen Anspruch mit einem bestimmten Wert haben. Sie könnten es so machen:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
Sie können dann [Authorize(Policy = "FirebaseAdministrators")]
einige Aktionen verwenden.
Ein letzter zu beachtender Punkt: Wenn Sie AuthenticationFailed
Ereignisse abfangen und etwas anderes als die erste AddJwtBearer
Richtlinie verwenden, wird möglicherweise Folgendes angezeigt: IDX10501: Signature validation failed. Unable to match key...
Dies wird dadurch verursacht, dass das System jede AddJwtBearer
nacheinander überprüft, bis eine Übereinstimmung erzielt wird. Der Fehler kann normalerweise ignoriert werden.