1

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 ..

Antwort

2

Sie die folgende Überprüfung in Ihrem ClaimsTransformer für den anonymen Zugriff testen können.

using System.Security.Claims; 
using System.Web; 
using System.Web.Security; 

private bool IsAnonymousAccessAllowed => UrlAuthorizationModule.CheckUrlAccessForPrincipal(
    HttpContext.Current.Request.Path, 
    AnonymousClaimsPrincipal, 
    HttpContext.Current.Request.RequestType 
); 

mit AnonymousClaimsPrincipal als

ClaimsPrincipal AnonymousClaimsPrincipal => new ClaimsPrincipal(
    (IIdentity) new ClaimsIdentity(
     (IEnumerable<Claim>) new List<Claim>() { 
      new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "") 
     } 
    ) 
); 

ändern Sie die Logik in dem ClaimsTransformer Transformation für die anonymen Zugriff überspringen:

if (!IsAnonymousAccessAllowed && context.Principal.Identity.IsAuthenticated) { /* ... */ } 

(Dieser Code ist von einem MVC5 Projekt, ich hoffe, dass es auch Werke in .net Kern.)

+0

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

+1

@Learner anzuhängen, können Sie leicht eine Erweiterungs-Methode zu ClaimsPrincipal hinzufügen oder ClaimsIdentity statt eigene Identity - Klasse – quetzalcoatl

+0

@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

Verwandte Themen