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 AddXXXMethode 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 401ausgegeben.
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 Firebaseund Customsollte 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 AuthenticationSchemesEigenschaft, 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 AuthenticationFailedEreignisse abfangen und etwas anderes als die erste AddJwtBearerRichtlinie verwenden, wird möglicherweise Folgendes angezeigt: IDX10501: Signature validation failed. Unable to match key...Dies wird dadurch verursacht, dass das System jede AddJwtBearernacheinander überprüft, bis eine Übereinstimmung erzielt wird. Der Fehler kann normalerweise ignoriert werden.