SSO-Konfigurationsbeispiel des Identitäsanbieters Microsoft Entra External ID
Dieser Artikel beschreibt die notwendige Konfiguration innerhalb des Identitätsanbieters Microsoft Entra External ID, um eine SSO Anmeldung bereitzustellen.
Schritt 1: External Tenant erstellen
Es wird ein Microsoft Entra External ID Tenant benötigt – nicht nur ein normaler Workforce-Tenant, wenn es um CIAM-/Kundenidentitäten geht. External ID nutzt einen separaten externen Tenant für Kundenkonten, App-Registrierungen, User Flows und Sign-in-Methoden (s. Microsoft Learn).
-
Microsoft Entra Admin Center öffnen.
-
Manage tenants aufrufen.
-
Create klicken.
-
External auswählen.

- Continue klicken.
- Schritt Basics:
Tenant Name: external-identities-for-digital-services
Domain Name: customXDigitalServices
Contry/Region: Germany
- Next klicken.
- Schritt Add a subscription.

- Next klicken.
- Schritt Review + create.
- Create klicken.

- Manage tenants aufrufen.

- External ID Tenant wechseln (switch directory).
Schritt 2: Testbenutzer für den Login anlegen
In der Admin Console:
- In der Navigation auf Users klicken.
- New user klicken.
-
Create new external user klicken.

-
Schritt Basics:
Identities User Name: r_zufall
Identities Email: rainer.zufall@muster.com
Display name: Rainer Zufall
-
Next klicken.
-
Schritt Properties.
First name: Rainer
Last name: Zufall
User type: Member
-
Next klicken.
-
Next klicken.
-
Schritt Review + create.
-
Create klicken.

Konfigurator mit Endkunden-Accounts
Für den Konfigurator mit Endkunden-Accounts ist Create new external user vermutlich die korrekte Wahl.
Die drei Optionen haben unterschiedliche Zielgruppen:
Option 1: Create new user
Erstellt einen lokalen Benutzer im Tenant (Workforce-/interner Benutzer). Das sind typischerweise Administratoren, Entwickler oder Mitarbeiter, die den Tenant verwalten. Diese Benutzer erscheinen üblicherweise als normale Mitgliedskonten des Tenants.
Beispiele:
admin@firma.onmicrosoft.com
support@firma.de
interner Servicemitarbeiter
Option 2: Invite external user
Erstellt einen B2B-Gastbenutzer durch Einladung eines Benutzers aus einem anderen Tenant oder einem Microsoft-Konto. Der Benutzer meldet sich weiterhin mit seiner eigenen Identität an.
Beispiele:
Lieferant
Externer Berater
Partnerunternehmen
Option 3: Create new external user
Das ist die für External ID / CIAM gedachte Variante. Hier werden Kunden direkt im External Tenant angelegt. Dieser Benutzer gehört nicht zu der internen Workforce, sondern ist ein Customer Account.
Beispiele:
kunde1@beispiel.de
kunde2@beispiel.de
testkunde@firma.de
Empfehlung für Konfigurator
| Benutzerart | Anlage |
| Administratoren | Create new user |
| Support-Mitarbeiter | Create new user |
| Endkunden | Create new external user |
| Partner mit eigenem M365-Tenant | Invite external user |
Kunden können zunächst händisch angelegt und später auf Selbstregistrierung umgestellt werden, ohne die Architektur zu ändern.
User type
Für Endkunden im External-ID-Tenant empfiehlt es sich, in aller Regel den Type Member zu wählen.
Member:
- Kunden, die du im External-ID-Tenant verwaltet werden.
- Kunden, die sich an deinem Konfigurator anmelden.
- Lokale Customer-Konten (CIAM-Szenario).
- Benutzer, die über Sign-up/User Flows angelegt werden oder von Admins als Customer erstellt werden.
Guest:
- B2B-Kollaborationsszenarien.
- Benutzer aus anderen Unternehmen/Tenants.
- Externe Partner, Lieferanten oder Berater, die auf Ressourcen zugreifen sollen.
Beispiele:
| Person | Usertype |
| IT-Mitglied (Admin) | Member |
| Support-Mitarbeiter | Member |
| Kunde Müller GmbH | Member |
| Kunde Meier KG | Member |
| Externer Berater von Accenture | Guest |
| Lieferant mit eigenem M365-Tenant | Guest |
Für einen klassischen SaaS-/Kundenportal-/Konfigurator-Anwendungsfall empfiehlt es sich Create new external user + Member zu verwenden. Das entspricht am ehesten dem CIAM-Modell von Entra External ID, bei dem Kunden eigenständige Kundenkonten im External Tenant sind.
Schritt 3: Web-Client anlegen
In der Admin Console:
- In der Navigation auf App registrations klicken.
- New registration klicken.
- Beispiel:
Name: customX Web
Supported account types: Single tenant only
Redirect URI Plattform: Single-page application (SPA)
Redirect URI: http://localhost/CustomXApp/Start.html
- Register klicken.

-
Application (client) ID notieren (Format:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).
Schritt 4: API-Client anlegen
In der Admin Console:
-
In der Navigation auf App registrations klicken.
-
New registration klicken.
-
Beispiel:
Name: customX API
Supported account types: Single tenant only
- Register klicken.

-
Application (client) ID notieren (Format:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). -
Directory (tenant) ID notieren (Format:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).
Schritt 5: (API-) Client Scope anlegen
In der Admin Console:
- In der Navigation auf App registrations klicken.
- Den Tab All applications wechseln.
- customX API klicken.
- In der Sub-Navigation auf Expose an API klicken.
- Application ID URI Add klicken.

- Den vorgeschlagenen Wert (
api://<api-client-id>) übernehmen.
- Save klicken.
- Add a scope klicken.
- Beispiel:
Scope name: customx-user-access
Who can consent: Admins and users
Admin consent display name: Access customX API
Admin consent description: Allows access to the customX API.
User consent display name: Access digital-services
User consent description: Allows the application access to our digital services.
State: Enabled
-
Add scope klicken.
- Scopes (hier:
api://<api-client-id>/customx-user-access) notieren.
Who can consent?
Für deinen Konfigurator mit Entra External ID ist die Einstellung meistens nicht kritisch, aber es ist gut zu verstehen, was sie bewirkt.
Wenn bei einem Scope (Expose an API → Add scope) die Option "Who can consent?" definiert wird, geht es darum, wer die Berechtigung für diesen Scope erteilen darf.
Admins and users
Jeder Benutzer kann selbst der Anwendung die Berechtigung für diesen Scope geben.
Beispiel:
-
Konfigurator fordert den Scope konfigurator.read.
-
Ein Benutzer meldet sich an.
-
Falls noch keine Zustimmung vorliegt, kann der Benutzer selbst auf Accept klicken.
-
Danach darf die Anwendung den Scope verwenden.
Das ist typisch für wenig kritische Berechtigungen wie:
-
Profil lesen
-
Eigene Daten lesen
-
Eigene Aufträge verwalten
Admins only
Nur ein Administrator des Tenants darf die Zustimmung erteilen.
Beispiel:
-
Der Scope gewährt Zugriff auf sensible Daten.
-
Ein normaler Kunde kann die Zustimmung nicht selbst erteilen.
-
Ein Admin muss einmalig Tenant-weite Zustimmung geben.
Das wird häufig verwendet für:
-
Administrative APIs
-
Zugriff auf Unternehmensdaten
-
Hochprivilegierte Berechtigungen
Entscheidungshilfe
Kunden melden sich an, um:
-
ihre Konfigurationsprojekte anzusehen
-
ihre Konfigurationsprojekte zu bearbeiten
dann wird üblicherweise Admins and users verwendet. Der Scope repräsentiert nur den Zugriff auf die eigene Konfigurator-API. Die Kunden geben diesem Scope einmal ihre Zustimmung.
Schritt 6: Client Scope dem Web-Client zuordnen
In der Admin Console:
-
In der Navigation auf App registrations klicken.
-
Den Tab All applications wechseln.
-
customX Web klicken.
-
In der Sub-Navigation auf API permissions klicken.
-
Add a permission klicken.
-
Den Tab APIs my organization uses wechseln.
-
customX API auswählen.

-
Berechtigung vergeben.
Delegated permission: ausgewählt
Permissions: customx-user-access auswählen
-
Add permissions klicken.
Admin consent required
Für Konfiguratoren mit externen Kunden wird Admin consent required normalerweise nicht aktiviert.
Wenn diese Option aktiviert ist, kann ein Benutzer den Scope nicht selbst freigeben. Stattdessen muss ein Administrator des Tenants die Zustimmung erteilen. Das wird typischerweise für höher privilegierte Berechtigungen verwendet.
Aktuelle Architektur:
External ID Tenant
├─ Web Client
├─ API Client
└─ Externe Kunden (Member)
Der Web Client ruft die eigene API mit dem Scope customx-user-access auf. Der Benutzer greift lediglich auf die eigene Anwendung zu. Er beantragt keine Microsoft Graph-Rechte und keine administrativen Berechtigungen.
In diesem Fall ist es üblich:
Scope: customx-user-access
Who can consent: Admins and users
Admin consent required: Nein
Ist die Option aktiviert, müssen alle Zugriffe auf diesen Scope zuvor administrativ genehmigt werden.
Das kann dazu führen, dass:
-
Logins fehlschlagen,
-
Consent-Meldungen erscheinen,
-
zusätzliche Freigaben im Tenant ohne einen echten Sicherheitsgewinn vorgenommen werden müssen.
Die Option ist für gedacht für Szenarien wie:
-
Backend-Admin-API
-
Zugriff auf besonders sensible Daten
-
Multi-Tenant-Anwendungen für fremde Unternehmen
-
Scopes, die normale Benutzer niemals eigenständig freigeben sollen
Schritt 7: User Flow erstellen
Entra External ID braucht zusätzlich einen Sign-up and sign-in User Flow. Ein User Flow definiert, wie sich Kunden anmelden bzw. registrieren und welche Attribute bei der Registrierung gesammelt werden.
In der Admin Console:
- In der Navigation auf External identities klicken.
- In der Sub-Navigation auf User flows klicken.
- New user flow klicken.
- User flow erstellen:
Name: digital-services-sign-up-and-sign-in
Identity providers: Email Accounts with password
User attributes: Given Name und Surname
-
Create klicken.

Schritt 8: User Flow dem Web-Client zuordnen
In der Admin Console:
- In der Navigation auf External identities klicken.
- In der Sub-Navigation auf User flows klicken.
- digital-services-sign-up-and-sign-in klicken.
- In der Sub-Navigation auf Applications klicken.
- Add application klicken.

-
Select klicken.
Schritt 9: E-Mail-Claim im Access-Token bereitstellen
In der Admin Console:
- In der Navigation auf App registrations klicken.
- Den Tab All applications wechseln.
- customX API klicken.
- In der Sub-Navigation auf Token configuration klicken.
- Add optional claim klicken.
Token type: Access
Claim email: On
Turn on the Microsoft Graph email permission (required for claims to appear in token): On
-
Add klicken.
-
Add klicken.
Schritt 10: customX konfigurieren
Issuer bestimmen
In der Admin Console:
- In der Navigation auf App registrations klicken.
- Den Tab All applications wechseln.
- customX Web klicken.
- Endpoints klicken.
- OpenID Connect metadata document-Link kopieren.

- Kopierten Link in neuem Tab eingeben.
- Issuer-Adresse kopieren.

Eintragung in customX Einstellungen
- "C:\customX\Config\customX.ini" öffnen.
- Einstellungen eintragen.
[SSO]
Authentication=3
[OpenIdConnectAuthentication]
;issuer=https://<tenant-subdomain>.ciamlogin.com/<tenant-id>/v2.0
;web-client-id=<Application (client) ID des Web-Clients>
;api-client-id=<Application (client) ID des API-Clients>
;scopes=api://<api-client-id>
issuer=https://customxdigitalservices.ciamlogin.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/v2.0
redirect-uri=http://localhost/CustomXApp/Start.html
web-client-id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
api-client-id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
scopes=api://XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
[SSOParameterMapping]
cxEmail=email
Schritt 11: (Optional) Benutzerdefinierte Anwendungsansprüche (Claims) übergebe
Benutzerattribute anlegen
In der Admin Console:
- In der Navigation auf External identities klicken.
- In der Sub-Navigation auf Custom user attributes klicken.
- Add klicken.
Name: CustomerID
Data Type: string
Description: Customer identifier for digital-services.
- Create klicken.
- Add klicken.
Name: ConfiguratorUserRole
Data Type: string
Description: Application role for configurator.
-
Create klicken.
Werte mittels Microsoft Graph setzen
Microsoft Graph öffnen und Berechtigungen setzen
- Microsoft Graph des External Tenants aufrufen.
https://developer.microsoft.com/graph/graph-explorer?tenant=<TENANT-ID>
Beispiel:
https://developer.microsoft.com/graph/graph-explorer?tenant=11111111-2222-3333-4444-555555555555 - Mit einem Admin-Konto aus dem External Tenant anmelden.
- Tenant kontrollieren.
GET https://graph.microsoft.com/v1.0/organization?$select=id,displayName,verifiedDomains -
Run query klicken.

- Berechtigungen setzen.
User.ReadWrite.All
Directory.ReadWrite.All
Extensions-App-ID ermitteln
In der Admin Console:
- In der Navigation auf App registrations klicken.
- Den Tab All applications wechseln.
- Ausdruck suchen:
b2c-extensions-app
oder
aad-extensions-app - Application (client) ID kopieren.
- Bindestriche entfernen.

Beispiel:
Original:
831374b3-bd50-41bf-aa54-263ec9e050fc
Für Extension Attribute:
831374b3bd5041bfaa54263ec9e050fc
Benutzerdaten prüfen
-
Microsoft Graph öffnen
-
Benutzer überprüfen.
GET https://graph.microsoft.com/v1.0/users/<user-id>
-
Run query klicken.

- Werte setzen.
PATCH https://graph.microsoft.com/v1.0/users/<user-id>
Content-Type: application/json
{
"extension_<extensions-app-id>_CustomerID": "4711",
"extension_<extensions-app-id>_ConfiguratorUserRole": "customer"
} - Run query klicken.

- Ergebnis prüfen
GET https://graph.microsoft.com/v1.0/users/<user-id>?$select=id,displayName,userPrincipalName,extension_<extensions-app-id>_CustomerID,extension_<extensions-app-id>_ConfiguratorUserRole
Anwendungsanspruch dem Access-Token hinzufügen
In der Admin Console:
- In der Navigation auf App registrations klicken.
- Den Tab All applications wechseln.
- customX API klicken.
- Bei Managed application in local directory auf customX API klicken.

- In der Sub-Navigation auf Single sign-on klicken.
- Bei Attributes & Claims auf Edit klicken.
- Add new claim klicken.
- Manage claim:
Name: customer_id
Source: Directory schema extension
Select Application: Extensions-App
- Select klicken.
- user.CustomerID auswählen.

- Add klicken.
- Add new claim klicken.
-
Manage claim:
Name: configurator_user_role
Source: Directory schema extension
Select Application: Extensions-App
-
Select klicken.
-
user.ConfiguratorUserRole auswählen.

Ggf. Manifest Datei anpassen
Erscheint die Fehlermeldung "OIDC Applications require custom signing keys to customize claims. Please check the security considerations before customizing the claims for the application", muss für Single-Tenant-Apps einen OIDC/JWT-Claim zu customizen.
Für Single-Tenant-Apps ist der normale Weg: Die App muss im Manifest explizit erlauben, dass gemappte Claims akzeptiert werden — über acceptMappedClaims: true. Microsoft beschreibt acceptMappedClaims genau dafür: Eine Anwendung kann Claims Mapping ohne eigenen Custom Signing Key nutzen, muss aber explizit anerkennen, dass Tokeninhalte durch Claims-Mapping verändert wurden.
In der Admin Console:
-
In der Navigation auf App registrations klicken.
-
Den Tab All applications wechseln.
-
customX API klicken.
-
In der Sub-Navigation auf Manifest klicken.
-
Nach "acceptMappedClaims": null suchen.
-
"acceptMappedClaims" auf true setzen.

WarnungacceptMappedClaims: true sollte nur bei Single-Tenant-Apps gesetzt werden. Microsoft warnt ausdrücklich davor, diese Eigenschaft bei Multi-Tenant-Apps zu setzen, weil sonst bösartige Akteure Claims-Mapping-Policies für deine App ausnutzen könnten.
Mapping in den customX-Einstellungen hinzufügen
- "C:\customX\Config\customX.ini" öffnen.
- Einstellungen eintragen.
[SSOParameterMapping]
cxEmail=email # Bereits in Schritt 9 gesetzt
IdentityProviderCustomerID=customer_id
IdentityProviderConfiguratorUserRole=configurator_user_role

Schritt 12: Access token überprüfen
-
Webbrowser öffnen.
-
DevTools öffnen z. B. Taste F12 drücken.
-
Tab Network/ Netzwerk öffnen.
-
customX Startseite aufrufen (http://localhost/CustomXApp/Start.html).
-
SSO-Button klicken.
-
In Microsoft Entra External ID authentifizieren.
-
Im Network-Tab im Filter nach
tokensuchen. -
Token auswählen.
-
Tab Preview auswählen

-
access_token Wert kopieren.
-
JSON-Web Token encoder öffnen (https://www.jwt.io/).
-
Access-Token encoden.
- Inhalt auf wichtige Claims prüfen.
{
"aud": "<api-client-id>",
"iss": "https://<tenant-subdomain>.ciamlogin.com/<tenant-id>/v2.0",
...
"azp": "<web-client-id>",
...
"email": "rainer.zufall@muster.com",
"name": "Rainer Zufall",
...
"preferred_username": "rainer.zufall@muster.com",
...
"scp": "customx-user-access",
...
"customer_id": "1111",
"configurator_user_role": "customer"
}
Das bedeutet:
| Claim | Bedeutung | Bewertung |
|---|---|---|
| iss | Aussteller (Issuer) des Tokens | Entspricht dem konfigurierten Entra External ID Tenant |
| aud | Zielanwendung (Audience) des Tokens | Client-ID der customX API ist enthalten |
| azp | Autorisierte Anwendung, die das Token angefordert hat | Entspricht der Client-ID von customX Web |
| scope | Berechtigungen (Scopes), die dem Benutzer erteilt wurden | customx-user-access ist enthalten |
| customer_id | Benutzerdefinierter Claim | vorhanden |
| configurator_user_role | Benutzerdefinierter Claim | vorhanden |
Ergebnisbewertung
Die Token-Prüfung ist erfolgreich, wenn:
-
der Issuer (iss) dem konfigurierten Tenant entspricht,
-
die Audience (aud) auf die customX API verweist,
-
die anfragende Anwendung (azp) die customX-Webanwendung ist,
-
der erforderliche Scope customx-user-access enthalten ist,
-
sowie alle benötigten benutzerdefinierten Claims (z. B. customer_id und configurator_user_role) vorhanden sind.
Sind diese Voraussetzungen erfüllt, wurde das Access Token korrekt ausgestellt und kann von der customX API zur Autorisierung des Benutzers verwendet werden.