# System for Cross-Domain Identity Management (SCIM)

### Voraussetzungen

1. Sie müssen Entra-ID-Administrator sein
2. Sie müssen Blockbrain-Administrator sein

### Schritt 1 – SCIM-Token in Blockbrain generieren

1. Holen Sie sich Ihr Admin-JWT (F12 für die Browser-Entwicklertools, wenn Sie angemeldet sind, oder ähnlich)
2. Senden: Der Provider-Schlüssel muss sein `entra`<br>

   ```http
   POST https://integrations.theblockbrain.ai/api/v1/scim/tokens
   Authorization: Bearer <tokenhere>
   Content-Type: application/json
   {
       "description": "Entra ID Produktion-Synchronisierung",
       "provider": "entra"
   }
   ```
3. Speichern Sie die Antwort, sie wird nur einmal angezeigt<br>

   ```json
   {
       "token": "82a236d740558501b824fd7ecabcb675b....",
       "description": "Entra ID SCIM-Bereitstellung",
       "provider": "entra"
   }
   ```

### Schritt 2 – Eine Enterprise-Anwendung in Azure erstellen

1. Gehen Sie zu Azure Portal → Entra ID → Enterprise-Anwendungen
2. Klicken Sie auf Neue Anwendung → Eigene Anwendung erstellen
3. Benennen Sie sie blockbrain (oder den Namen Ihrer Organisation) und wählen Sie „Integrieren Sie eine andere Anwendung, die Sie in der Galerie nicht finden“
4. Klicken Sie auf Erstellen

### Schritt 3 – Bereitstellung konfigurieren

1. Gehen Sie zu Bereitstellung → Loslegen
2. Setzen Sie den Bereitstellungsmodus auf Automatisch
3. Unter Administrator-Anmeldeinformationen:
   1. Mandanten-URL, Wert: `https://integrations.theblockbrain.ai/scim/v2`
   2. Geheimer Token, Wert: `<Token aus Schritt 1>`
4. Klicken Sie auf Verbindung testen — Sie sollten ein grünes Erfolgsbanner erhalten
5. Klicken Sie auf Speichern

### Schritt 4 – Für Attributzuordnungen konfigurieren

Entras Standardwerte funktionieren, benötigen aber eine kleine Bereinigung. Öffnen Sie unter Zuordnungen „Entra-ID-Benutzer bereitstellen“.

Erforderliche Benutzerattribute (diese beibehalten):

<table><thead><tr><th>Entra-Attribut</th><th>SCIM-Attribut</th><th data-hidden></th></tr></thead><tbody><tr><td>userPrincipleName</td><td>userName</td><td></td></tr><tr><td>IsSoftDeleted</td><td>active</td><td></td></tr><tr><td>mail</td><td>emails[type eq "work"].value</td><td></td></tr><tr><td>givenName</td><td>name.givenName</td><td></td></tr><tr><td>surname</td><td>name.familyName</td><td></td></tr><tr><td>displayName</td><td>displayName</td><td></td></tr><tr><td>objectId</td><td>externalId</td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

Wichtig: Die Zuordnung externalId zu objectId ist das, was blockbrain für die Idempotenz verwendet — wenn ein Benutzer erneut bereitgestellt wird, findet blockbrain den vorhandenen Datensatz anhand der Entra-Objekt-ID und gibt 200 zurück, anstatt ein Duplikat zu erstellen.

Für Gruppen öffnen Sie „Entra-ID-Gruppen bereitstellen“:

<table><thead><tr><th>Entra-Attribut</th><th>SCIM-Attribut</th><th data-hidden></th></tr></thead><tbody><tr><td>displayName</td><td>displayName</td><td></td></tr><tr><td>objectId</td><td>externalId</td><td></td></tr><tr><td>members</td><td>members</td><td></td></tr></tbody></table>

Entra reduziert verschachtelte Gruppenhierarchien serverseitig automatisch, bevor es sendet — der Entra-Adapter von blockbrain erwartet dies und behandelt alle members-Einträge als direkte Benutzer-IDs.

### Schritt 5 – Festlegen, welche Benutzer/Gruppen bereitgestellt werden

Wählen Sie unter Einstellungen → Bereich eine der folgenden Optionen:

* „Nur zugewiesene Benutzer und Gruppen synchronisieren“ — empfohlen; Sie steuern, wer bereitgestellt wird, indem Sie diese der Enterprise-App zuweisen
* „Alle Benutzer und Gruppen synchronisieren“ — stellt Ihr gesamtes Verzeichnis bereit

Um Benutzer/Gruppen zuzuweisen: Gehen Sie zu Benutzer und Gruppen → Benutzer/Gruppe hinzufügen.

### Schritt 6 – Bereitstellung starten

1. Unter Bereitstellung setzen Sie den Bereitstellungsstatus auf Ein
2. Klicken Sie auf Speichern
3. Klicken Sie auf Bei Bedarf bereitstellen, um vor dem vollständigen Zyklus mit einem bestimmten Benutzer zu testen

### Was passiert, wenn Entra einen Benutzer bereitstellt

Entra POST /scim/v2/Users → blockbrain prüft MongoDB auf vorhandenen userName oder externalId (idempotent)\
→ falls neu: erstellt Identität in Zitadel, schreibt Zuordnung in MongoDB mapping\_user\
→ Benutzer wird automatisch der allgemeinen Gruppe des Mandanten hinzugefügt\
→ effectiveRole wird berechnet und mit dem Projekt-Grant in Zitadel synchronisiert\
→ gibt 201 zurück (oder 200, wenn bereits vorhanden)

### Wenn ein Benutzer in Entra deaktiviert wird (oder aus dem App-Bereich entfernt wird):

<pre><code><strong>Entra PATCH /scim/v2/Users/{id}
</strong><strong>{ "Operations": [{ "op": "replace", "path": "active", "value": false }] }
</strong></code></pre>

→ MongoDB-Status → "inaktiv"\
→ Zitadel: POST /v2/users/{id}/deactivate\
→ der Benutzer kann sich nicht mehr bei blockbrain anmelden

▎ Hinweis: Entra sendet manchmal active: "False" als String — der Handler deckt sowohl false (boolesch) als auch "False" (String) ab.

### Was passiert, wenn Entra eine Gruppe bereitstellt

```
Entra POST /scim/v2/Groups
    { "displayName": "KB Builders", "externalId": "<objectId>", "members": [...] } 
```

→ blockbrain prüft anhand von externalId (idempotent)\
→ erstellt einen group\_user-Datensatz in MongoDB mit isAutoSync: true\
→ members-Liste enthält Zitadel-Benutzer-IDs (Entra reduziert Verschachtelungen automatisch)\
→ gibt 201 zurück

Gruppen in blockbrain haben standardmäßig die Rolle consumer. Um eine Gruppe auf builder, admin usw. hochzustufen, aktualisieren Sie die Rolle der Gruppe über die Blockbrain-Admin-Oberfläche — diese Rolle wird dann als effectiveRole für alle Mitglieder angewendet.

### Bereitstellungszyklus

Entra führt etwa alle 40 Minuten eine inkrementelle Synchronisierung aus. Ein vollständiger Zyklus läuft etwa alle 24 Stunden. Sie können jederzeit „Bei Bedarf bereitstellen“ für einen bestimmten Benutzer/eine bestimmte Gruppe auslösen.

### Fehlerbehebung

<table><thead><tr><th>Symptom</th><th>Prüfen Sie</th><th data-hidden></th></tr></thead><tbody><tr><td>Verbindung testen schlägt mit 401 fehl</td><td>Token ist falsch oder Provider-Mismatch — mit "provider": "entra" neu generieren</td><td></td></tr><tr><td>Verbindung testen schlägt mit 404 fehl</td><td>Mandanten-URL falsch — muss auf /scim/v2 enden, nicht auf /scim/v2/</td><td></td></tr><tr><td>Doppelte Benutzer</td><td>externalId → objectId-Zuordnung fehlt in der Attributzuordnung</td><td></td></tr></tbody></table>

### Rollenbereitstellung

#### Das Kernproblem

SCIM hat keinen Standard für Rollen. Entra sendet Rollen über ein AppRoleAssignmentsComplex-Attribut in einem nicht offensichtlichen Format. Der Code behandelt dies in parseSCIMRoleValue in repository.ts:9.

Was Entra tatsächlich sendet

Wenn Sie einem Benutzer in Entra eine App-Rolle zuweisen, erscheint sie im SCIM-PATCH-Body ungefähr so:

<pre><code>{
"Operations": [{
<strong>    "op": "replace",
</strong>    "path": "roles[primary eq "True"].value", 
    "value": "{"id":"some-uuid","value":"admin","displayName":"Blockbrain Admin"}"
}]
}
</code></pre>

Das value-Feld ist ein als String dargestelltes JSON-Objekt, kein einfacher String. Der Code in repository.ts:13 erkennt dies, parst es und extrahiert das innere value-Feld ("admin") als den eigentlichen Rollenschlüssel.

Entra kann Rollen auch als Array von Objekten senden (ohne den Filterpfad), wobei value\[0].value verwendet wird.

#### Blockbrain-Rollennamen

Die gültigen Rollen sind in role-engine.ts definiert. Sie müssen exakt übereinstimmen (Groß-/Kleinschreibung ignoriert):

* consumer
* Builder
* pro-user
* admin
* superadmin

Alles, was nicht übereinstimmt, fällt auf consumer zurück.

#### So konfigurieren Sie dies in Entra

**Schritt 1 — App-Rollen in Ihrer Enterprise-Anwendung definieren**

Gehen Sie im Azure Portal zu Ihrer Enterprise-App → App-Rollen → App-Rolle erstellen. Erstellen Sie eine Rolle pro blockbrain-Rollenebene:

Anzeigename: Blockbrain Consumer\
Wert: consumer\
Beschreibung: Nur-Lese-Zugriff Erlaubt: Benutzer/Gruppen

Anzeigename: Blockbrain Builder\
Wert: builder\
...

Anzeigename: Blockbrain Admin Wert: admin ...

Das Feld Wert ist das, was blockbrain liest. Es muss exakt consumer, builder, pro-user, admin oder superadmin sein.

**Schritt 2 — Die Attributzuordnung in Entra SCIM hinzufügen**

In der Enterprise-App → Bereitstellung → Attributzuordnungen → Entra-ID-Benutzer bereitstellen fügen Sie eine neue Zuordnung hinzu:

* Zuordnungstyp: Ausdruck
* Ausdruck: AppRoleAssignmentsComplex(\[appRoleAssignments])
* Zielattribut: roles

Dies bewirkt, dass Entra das als String dargestellte JSON-Objektformat sendet, das der Code erwartet.

**Schritt 3 — Rollen Benutzern oder Gruppen zuweisen**

In der Enterprise-App → Benutzer und Gruppen wird Entra Sie beim Zuweisen eines Benutzers oder einer Gruppe auffordern, eine Rolle auszuwählen. Wählen Sie die passende blockbrain-Rolle. Benutzer ohne Rollenzuweisung erhalten standardmäßig consumer.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.en.theblockbrain.ai/de/fur-administratoren/klassische-microsoft-integrationen/system-for-cross-domain-identity-management-scim.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
