CodamAIDocs
Themafertig

Der Weg ins Token

Profil in Keycloak, Claim-Mapper, Claim im Token, Attribut im RequestContext.

Ausprägungen
ein Wertmehrere Wertekein WertWert pro Mandant

Worum es geht

Damit ein Attributfilter in CDMS einen Wert lesen kann, muss der Wert eine lange Strecke zurücklegen: vom Konto in Keycloak über das Token bis in den RequestContext. Der RequestContext ist das Objekt, in dem CIAS für jede Anfrage festhält, wer anfragt, mit welchen Rollen und welchen Attributen.

Die Strecke

sequenceDiagram
    participant M as Modul
    participant C as CIAS
    participant K as Keycloak
    participant B as Browser/BFF
    participant D as CDMS
    M->>C: meldet region an (Deklaration)
    C->>K: Profil: region erlaubt
    C->>K: Client des Moduls: Mapper region → Claim region
    Note over C,K: einmal, beim Abgleich
    C->>K: Admin schreibt region = nord, west am Konto
    B->>K: Anmelden oder Token erneuern
    K-->>B: Token mit "region": ["nord", "west"]
    B->>D: Anfrage mit Token
    D->>C: Token prüfen (Filterkette)
    C->>C: Claim region → Attribut, ggf. Wert pro Mandant einsetzen
    C-->>D: RequestContext: effectiveUserAttributes.region = [nord, west]
    D->>D: Attributfilter: region IN (nord, west)

Die Stationen

StationWas dort passiertWer sorgt dafür
BenutzerprofilKeycloak speichert nur Attribute, die im Profil stehen. Dort steht auch, ob es eine Liste ist und wer es ändern darfder Abgleich, aus der Anmeldung
Wert am Kontoder eigentliche Wert der Personein Administrator über POST /cias/admin/users/{id}/profile-attributes, bei einer Vorliebe auch die Person selbst
Claim-Mapperein Eintrag am Client, der sagt: „Lege das Attribut region als Claim region ins Token.“ Er gilt für Access-Token, ID-Token und UserInfoder Abgleich, je Modul an dessen Client
Tokender Claim steht im Token. Bei einer Liste als JSON-Array, sonst als TextKeycloak, bei jedem Anmelden und Erneuern
RequestContextCIAS macht aus jedem übrigen Claim ein Attribut, immer als Liste von Texten. Ist das Attribut pro Mandant angemeldet, setzt CIAS den Wert des aktiven Mandanten einCIAS, bei jeder Anfrage
FilterCDMS liest das Attribut aus effectiveUserAttributesCDMS

Der Mapper sitzt am Client des Moduls, also an dem Client, dessen Token das Modul prüft. Welche Claims CIAS überhaupt als Attribut nimmt und welche nicht, steht unter Was aus dem Token gelesen wird.

Die Ausprägungen

Was im Token und im RequestContext ankommt

Wann: Attribut ohne multivalued, am Konto steht customerId = 4711.

Im Token steht "customerId": "4711". CIAS macht daraus eine Liste mit einem Eintrag.

Ergebnis: effectiveUserAttributes.customerId = ["4711"]

Wann: Attribut mit multivalued, am Konto stehen nord und west.

Im Token steht "region": ["nord", "west"]. Der Filter zerlegt zusätzlich jeden Eintrag an Kommas, nord,west in einem Eintrag wirkt also genauso.

Ergebnis: effectiveUserAttributes.region = ["nord", "west"]

Wann: Die Person hat keinen Wert, und das Attribut hat keinen Standardwert.

Keycloak lässt den Claim weg. Im RequestContext fehlt das Attribut. Ein Attributfilter in CDMS lehnt die Anfrage dann ab, statt alles zu liefern.

Ergebnis: 422 missing-attribute-on-profile bei einem gefilterten Modell

Wann: Das Attribut ist USER_IN_TENANT angemeldet.

Nach der Mandantenprüfung holt CIAS die Werte der Person für den aktiven Mandanten und setzt sie für diesen Schlüssel ein. Sie ersetzen den Wert aus dem Token, sie werden nicht dazugemischt. Ersetzt werden nur Schlüssel, die die Anwendung selbst pro Mandant anmeldet, alle anderen kommen unverändert aus dem Token.

Ergebnis: siehe Ein Wert pro Person oder pro Mandant

Wo es hängen kann

Warum kommt mein Attribut nicht an?
Steht im Profil?Mapper am Client?Wert am Konto?Neues Token geholt?Ergebnis
nein–––Keycloak nimmt keinen Wert an. Meldet ein Modul das Attribut an? Lief der Abgleich?
janein––Wert steht am Konto, aber nicht im Token. Läuft das Modul mit dem richtigen Client?
jajanein–kein Claim, CDMS antwortet 422
jajajaneinaltes Token ohne den neuen Wert
jajajajakommt an

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-iam-keycloak – KeycloakAttributeAdapter (ensureAttributes, ensureClaim, mapper: oidc-usermodel-attribute-mapper, claim.name, id/access/userinfo token claim, multivalued)
  • CIAS/cias-authorization – RoleReconciliationService (writeProfile, deliver)
  • CIAS/cias-authentication – TokenParser (extractIdentity, admit, boundAttributesFor), EffectiveAttributes.resolve, AttributeLookup
  • CIAS/cias-user – UserAdminController.writeProfileAttributes (POST /cias/admin/users/{id}/profile-attributes)
  • CDMS – AbstractAttributeFilter (missing-attribute-on-profile, *)
  • CIAS/cias-authentication/docs/adr – ADR-042
Suchen