auf API-Ebene zu vermeiden, habe ich einige Identitätsansprüche von Identity-Server kommt der aktuelle Benutzer autorisiert, und ich konnte einige für die erste Ebene der Zulassung verwenden. Aber im nächsten Schritt reichen diese Ansprüche für zusätzliche Berechtigungsüberprüfungen nicht aus, ich muss mehr Daten aus der Datenbank abrufen.Wie Ansprüche Transformation für bestimmte Anforderungen in Asp.NET Kern
Meine Idee war es, eine benutzerdefinierte zu erstellen, wo ich alle Berechtigungen aus der Datenbank anhängen, aber ich möchte Datenbank nicht mehr als einmal pro Anfrage aufrufen.
So, dachte ich, meine eigene Implementierung von Microsoft.AspNetCore.Authentication.IClaimsTransformer
zu haben, die ich in der Pipeline, wie so hinzugefügt:
und meine aktuellen Transformationsmethode:
public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
{
if (context.Principal.Identity.IsAuthenticated)
{
var principal = new MyClaimsPrincipal(context.Principal);
principal.Permissions = /* load from db */;
return Task.FromResult<ClaimsPrincipal>(principal);
}
return Task.FromResult(context.Principal);
}
ich schon bemerkt, die Transformation behauptet Methode wird jedes Mal bei jeder Anfrage aufgerufen. Ich möchte also die Kontrolle darüber haben, um zu vermeiden, dass die Datenbank aufgerufen wird, wenn kein authentifizierter Benutzer oder keine Autorisierung erforderlich ist (Fall des Attributs AllowAnonymous
) und wenn keine zusätzlichen Berechtigungen (im Idealfall) erforderlich sind.
Ich glaube, dass die Ansprüche Transformation sollte Identity Server die Berechtigung oder etwas gebunden sein, aber keine Ahnung, wie.
Irgendwelche Gedanken dazu? Vielen Dank!
bearbeiten fand ich here, dass ich die Ansprüche Transformation OnTokenValidated
Teil JwtBearerEvents
von IdentityServer4.AccessTokenValidation
Haken könnte. Leider gibt es eine andere unbekannte Middleware, die MyClaimsPrincipal
überschreibt. Ich bin verwirrt, wie das funktioniert ..
Dies ist nützlich, .. Aber ich fand tatsächlich den besten Ort, um h ook die Umwandlung der Ansprüche zu (siehe Bearbeiten) .. Obwohl ich dort nicht mein eigenes 'ClaimsPrincipal' erstellen kann, denke ich daran, meine eigene' ClaimsIdentity' zu erstellen, um die zusätzlichen Daten an – Learner
@Learner anzuhängen, können Sie leicht eine Erweiterungs-Methode zu ClaimsPrincipal hinzufügen oder ClaimsIdentity statt eigene Identity - Klasse – quetzalcoatl
@Quetzalcoatl Aber ich wollte ein komplettes Objekt anhängen, nicht nur zusätzliche Ansprüche, also habe ich es geschafft, meine eigene Identität zu erstellen, sie zu den 'Identitäten' hinzuzufügen und dann habe ich gegen dieses Objekt Prüfungen durchgeführt die Autorisierungshandler – Learner