Eine Helferbibliothek zur Implementierung der Berechtigungs-/Attributbasierten Access Control (ABAC) mit JSON-Web-Token unter Verwendung der Richtlinienbasis der ASP.NET Core (PBAC).
Erstellen Sie die Berechtigungen Enum:
public enum Permissions
{
Create = 0 ,
Read = 1 ,
Update = 2 ,
Delete = 3 ,
}Beachten Sie, dass es wichtig ist, den genauen zugrunde liegenden Wert für jede Berechtigung zu haben - das Durcheinander durch das Durcheinander von Berechtigungen durcheinander zu bringen!
Außerdem werden derzeit nur mit dem int als zugrunde liegenden Typ (der Standard) unterstützt.
Stellen Sie die Benutzerberechtigungswerte in Ihrem Identitätsanbieter mit dem PermissionSet fest:
user . Claims [ ClaimNames . Permissions ] = new PermissionSet < Permissions > ( new [ ]
{
Permissions . Create ,
Permissions . Read ,
} )
. ToCompactString ( ) ;Fügen Sie den Anforderungen des Berechtigungsrichtlinie mit demselben Antragsnamen wie oben hinzu:
services . AddPermissionBasedAuthorization < Permissions > ( options =>
options . PermissionsClaimName = ClaimNames . Permissions ) ; Beachten Sie, dass der Code oben nach Ihrer Logik eingefügt werden sollte, um die Berechtigungsrichtlinien zu erben, wenn Sie die DefaultPolicy in Ihrer App neu definieren.
(Optional) Erben Sie die AuthorizePermission<T> mit dem spezifischen Berechtigungs -Enum -Typ:
public class AuthorizePermissionAttribute : AuthorizePermissionAttribute < Permissions >
{
public AuthorizePermissionAttribute ( Permissions permission )
: base ( permission )
{ }
}Oder erstellen Sie eine Erweiterungsmethode, wenn Sie die minimalen APIs verwenden:
public static TBuilder RequirePermission < TBuilder > ( this TBuilder builder , Permissions permission )
where TBuilder : IEndpointConventionBuilder
{
if ( builder == null )
throw new ArgumentNullException ( nameof ( builder ) ) ;
return builder . RequireAuthorization ( new AuthorizePermissionAttribute < Permissions > ( permission ) ) ;
} Dekorieren Sie die Controller/Endpunkte mit dem Attribut der AuthorizePermission<T> (oder dem oben erstellten) Attribut:
[ HttpGet ]
[ Authorize ( Permissions . Read ) ]
public IActionResult Get ( )
=> Ok ( ) ;Oder wenn Sie die minimalen APIs verwenden:
app . MapGet ( "/" , ( ) => Results . Ok ( ) )
. RequirePermission ( Permissions . Read ) ; Der Berechtigungssatz wird in eine Zeichenfolge als Hex -Nummer serialisiert, in der n -th das Vorhandensein einer Genehmigung mit dem zugrunde liegenden Wert von n darstellt.
Betrachten Sie beispielsweise die folgende Erlaubniserum:
public enum Permissions
{
Create = 0,
Read = 1,
Update = 2,
Delete = 3,
Manage = 4,
}
Dann würde die binäre Darstellung eines Satzes, der alle oben genannten Berechtigungen enthält, so aussehen:
1 F - permission string
┌┬┬┤ ┌┬┬┤
0001 1111 - permission bit values
││││ ││││
7654 3210 - bit positions
└┬┘│ ││││
│ │ │││└ Create
│ │ ││└ Read
│ │ │└ Update
│ │ └ Delete
│ └ Manage
└ Not used
Für die Deserialisierung erfolgt das obige in der umgekehrten Reihenfolge.
Da wir basierend auf dem Umlaufwert die spezifische Bitposition berechnen können, die wir überprüfen müssen, müssen wir die gesamte Zeichenfolge nicht deserialisieren, wenn wir eine einzelne Berechtigung überprüfen.
Überprüfen eines einzelnen Berechtigungswerts aus der kompakten Zeichenfolge:
| Verfahren | Bedeuten | Fehler | Stddev | Zugewiesen |
|---|---|---|---|---|
| Berechtigungenset_Haspermission | 74.17 ns | 1,382 ns | 1,225 ns | - - |
Die Validierung eines Benutzers hat eine erforderliche Erlaubnis in seiner Anspruchsliste:
| Verfahren | Bedeuten | Fehler | Stddev | Zugewiesen |
|---|---|---|---|---|
| BerechtigteAuthorizationHandlerBenchmark_HandLerequirementAsync | 359.4 ns | 6.79 ns | 13.25 ns | 144 b |