2016-09-07 5 views
2

Die JWT RFC kein Problem mit komplexen Arrays zu haben scheinen, wie zum Beispiel:Complex Ansprüche in JWT

{ 
    "email": "[email protected]", 
    "businesses": [ 
     { 
      "businessId": "1", 
      "businessName": "One", 
      "roles": [ 
        "admin", 
        "accountant" 
      ] 
     }, 
     { 
      "businessId": "2", 
      "businessName": "Two", 
      "roles": [ 
        "support" 
      ] 
     } 
    ] 
} 

und dies scheint ein wünschenswertes Szenario für unsere Bedürfnisse, da im Rahmen des Tokens wir möchten eine Liste von Unternehmen haben, auf die ein Benutzer Zugriff hat und welche Rollen er für jedes Geschäft hat (es ist Teil seiner Identität). Die Autorisierungsrichtlinien in der API sollten diese Gruppen später verstehen und die erforderliche Berechtigungslogik anwenden.

Ich habe gesehen, dass mit IdentityServer4 die Ansprüche an die IEnumerable<Claim> IssuedClaims Eigenschaft der ProfileDataRequestContext hinzugefügt werden.

Gibt es eine empfohlene Alternative zu dieser komplexen Anspruchsstruktur? Wenn nicht, gibt es eine Möglichkeit, diese Struktur mit IdentityServer4 zu erstellen (vielleicht eine Erweiterung?) Oder wäre die einzige Möglichkeit, den JSON manuell zu serialisieren, da der Claim scheinbar nur eine Zeichenkette akzeptiert?

PS: Ich habe this question und this other wo einer der Autoren von Identity Server spricht über etwas ähnliches ist ein Antipattern gesehen. Nicht sicher, ob das Antipattern in den Patentansprüchen eine Struktur mit komplexen Ansprüchen oder Details zur Autorisierung darstellen soll.

Jeder Rat hierüber wäre großartig!

UPDATE:

Nach einem paar Gedanken zu geben Ich bin damit einverstanden eine komplexe Hierarchie von Ansprüchen, die nicht wünschenswert ist, und ich, um dieses Problem mit einer schmutzigen Lösung von prefixing Rollen für jeden BusinessID gehen könnte. Etwas wie folgt aus:

{ 
    "email": "[email protected]", 
    "roles": [ 
     "1_admin", 
     "1_accountant", 
     "2_support" 
    ], 
    "businesses": [ 
     "1_One", 
     "2_Two" 
    ] 
} 

, die Art, wie ich eine einfache Struktur zu halten und später, auf dem Client oder API ich die Ansprüche lesen und herausfinden, dass 1 ist die ID für das Geschäft mit dem Namen One und es hat die Rollen admin und account.

Wäre das eine bessere Lösung?

Antwort

4

Ansprüche sind über Identitätsinformationen - und nicht komplexe Erlaubnis "Objekte". Sie sind mit einem dedizierten Berechtigungsservice, der Ihre Berechtigungen in jedem gewünschten Format basierend auf der Identität des Benutzers zurückgibt, weit besser dran.

Ich hoffe auch, dass Ihre Berechtigungsdaten nicht geändert werden, während das Token verwendet wird, sonst enden Sie mit veralteten Daten.

Das besagt - Ansprüche sind immer Zeichenketten in. NET - aber Sie können JSON-Objekte in es serialisieren, indem Sie ClaimValueType auf IdentityServerConstants.ClaimValueTypes.Json setzen.

+0

Vielen Dank. Wenn sich die Ansprüche (Berechtigungsdaten) ändern, nehme ich an, dass es eine Möglichkeit gibt, das Token im Identitätsserver ungültig zu machen, wenn die API versucht, es zu validieren, so dass die API den Client (401) informieren kann, dass sie ein neues Token mit den Ansprüchen anfordern muss aktualisiert? – iberodev

+0

Andere Option besteht darin, ein anderes Token für den Client erneut auszugeben, wenn dieses auf andere Ressourcen des Unternehmens zugreifen möchte. Die Verwendung der Mandantenoption könnte hier passen? Client verfügt über ein Token, das seine Benutzeridentität für Business One mit Rollen A, B beschreibt. Der Benutzer tauscht zwei Benutzer in der Benutzeroberfläche aus und fordert ein neues Token an, indem er tenant = businessTwoId sendet, damit Identity Server erkennt, dass der Benutzer noch authentifiziert ist, und dieses Mal das neue Token mit Informationen zum Geschäft Zwei und seinen Rollen ausgibt.Dies vereinfacht JWT, nicht sicher, ob es möglich ist, verschiedene Tokens für den gleichen Benutzer und den anderen Mandanten auszustellen. – iberodev

+1

Verwenden Sie einfach keine Token für Berechtigungen, und Sie müssen nicht um die Tatsache herumarchi zieren, dass sie nicht dorthin gehören. – leastprivilege

Verwandte Themen