Entra ID
Single Sign-on mit Microsoft Entra ID (Azure AD), mit Rollen aus den Entra ID-Gruppen des Benutzers
- Funktionsweise
- Die Anwendung registrieren
- Den Anbieter hinzufügen
- Zuordnung zu Rollen
- Endpunkt von Microsoft Graph
- Einschränkungen
Funktionsweise
Ist ein Entra ID-Anbieter aktiviert, zeigt die Anmeldeseite unter Anmelden eine Entra ID-Schaltfläche. Eine Anmeldung läuft dann so ab:
- Die Schaltfläche schickt den Browser zu
/api/v2/auth/entraid, das ihn zu Microsoft weiterleitet. - Der Benutzer meldet sich bei Microsoft an, das mit einem Autorisierungscode zur Umleitungs-URL zurückleitet. Der Server tauscht diesen Code bei Microsoft gegen das ID-Token und ein Zugriffstoken für Microsoft Graph.
- Der Server liest die Gruppen des Benutzers aus Microsoft Graph (
/v1.0/me/transitiveMemberOf), sodass auch verschachtelte Gruppen zählen. - Die Gruppen werden mit dem Gruppenfilter nach ihrem Anzeigenamen gefiltert, und jede verbleibende Gruppe wird zweimal gespeichert, als
azuread/<object id>und alsazuread/<display name>.
Der Benutzername ist der Claim upn des Tokens, z. B. jdoe@example.com, oder der Claim preferred_username, wenn das Token kein upn hat; bei einem Geschäftskonto enthalten beide denselben Wert.
Die Anwendung registrieren
AnsibleForms braucht eine App-Registrierung im Entra Admin Center, unter App registrations > New registration:
- Geben Sie ihr einen Namen, wählen Sie Accounts in this organizational directory only als unterstützte Kontotypen und fügen Sie einen Redirect URI vom Typ Web hinzu:
https://af.example.com/api/v2/auth/entraid/callback. - Erstellen Sie unter Certificates & secrets ein Client-Secret und kopieren Sie seinen Wert; er wird nur einmal angezeigt.
- Fügen Sie unter API permissions die delegierten Microsoft Graph-Berechtigungen
User.ReadundGroupMember.Read.Allhinzu und erteilen Sie dafür die Administratorzustimmung. - Notieren Sie auf der Seite Overview die Application (client) ID und die Directory (tenant) ID.
Der Redirect URI ist die Adresse, unter der Benutzer AnsibleForms erreichen, gefolgt von /api/v2/auth/entraid/callback. Mit BASE_URL /forms wird daraus https://af.example.com/forms/api/v2/auth/entraid/callback. Er muss exakt mit der Umleitungs-URI der Anmeldedaten des Anbieters übereinstimmen.
Bis 7.2.0 lautete der Pfad /api/v2/auth/azureadoauth2/callback. Er funktioniert ab 7.3.0 weiterhin, sodass eine bestehende Registrierung nicht geändert werden muss; Anmeldedaten mit leerer Umleitungs-URI verwenden den neuen Pfad, fügen Sie ihn dann also der Registrierung hinzu.
AnsibleForms liest die Gruppen aus Graph und verwendet keinen Gruppen-Claim im Token, daher muss in der Registrierung kein Gruppen-Claim konfiguriert werden.
Den Anbieter hinzufügen
Fügen Sie den Anbieter unter Zugriff > SSO hinzu: Ein Assistent fragt seine Felder in vier Schritten ab, mit Microsoft Entra ID im Schritt Typ:
| Schritt | Feld | Bedeutung |
|---|---|---|
| Details | Name, Beschreibung | Ein eindeutiger Name für den Anbieter und eine optionale Beschreibung |
| Typ | Anbieter | Microsoft Entra ID; beim Anlegen festgelegt, bleibt er so |
| Anmeldedaten | Anmeldedaten-Eintrag | Ein Microsoft Entra ID-Eintrag aus Verbindungen > Anmeldedaten, siehe unten |
| Gruppen | Gruppenfilter | Regulärer Ausdruck; nur die Gruppen, deren Anzeigename passt, bleiben erhalten. Leer behält jede Gruppe |
Die Anmeldedaten enthalten die App-Registrierung, daher kann nur ein Admin sie hinzufügen oder ändern:
| Feld | Bedeutung |
|---|---|
| Tenant-ID | Erforderlich. Die Directory (tenant) ID, eine GUID, oder eine der Domänen des Tenants. Nur Benutzer dieses Tenants können sich anmelden |
| Client-ID | Die Application (client) ID |
| Client-Secret | Der Wert des Client-Secrets, verschlüsselt gespeichert oder aus einem Secret Store gelesen |
| Umleitungs-URI | Wie registriert, z. B. https://af.example.com/api/v2/auth/entraid/callback. Leer: die URL der App und der Callback-Pfad |
Anmeldedaten mit leerer Tenant-ID werden beim Speichern abgewiesen. Die Multi-Tenant-Endpunkte common, organizations und consumers werden abgewiesen, wenn der Anbieter gespeichert wird, der diese Anmeldedaten verwendet, da sie Benutzern jedes Microsoft-Tenants die Anmeldung erlauben würden. Bei der Anmeldung prüft der Server außerdem, dass das Token vom konfigurierten Tenant stammt. Ein Anbieter, der früher ohne Tenant-ID gespeichert wurde, meldet niemanden an: Bis die Tenant-ID eingetragen ist, protokolliert der Server Could not enable Microsoft Entra ID: set the tenant id to your tenant ('' would let any Microsoft tenant log in).
Bis 7.2.0 waren Tenant, Client-ID, Secret und Umleitungs-URL Felder des Anbieters. Das Upgrade auf 7.3.0 verschiebt sie in Anmeldedaten namens <provider>-sso, siehe Adressen in Anmeldedaten. Wählen Sie für jeden neuen Anbieter Anmeldedaten: Der Server akzeptiert weiterhin einen Anbieter mit eigener Client-ID und eigenem Secret aus der Zeit vor 7.3.0, der sich damit anmeldet, bis Anmeldedaten gewählt sind.
Es ist jeweils ein Entra ID-Anbieter aktiviert, der, mit dem sich die Entra ID-Schaltfläche anmeldet. Aktivieren im Menü der Zeile eines anderen oder sein Schalter Aktiviert schaltet die anderen seines Typs aus; die Spalte Aktiviert der Liste zeigt, welcher verwendet wird. Ein Anbieter kann auch die Anmeldeseite überspringen, siehe Single Sign-on umschalten. Das Speichern wendet ihn sofort an, ohne Neustart.
Zuordnung zu Rollen
In config.yaml ist eine Entra ID-Gruppe entraid/<object id> oder entraid/<display name>, und ein Benutzer ist entraid/<upn>. Die Objekt-ID ist im Tenant eindeutig und daher die sicherere Wahl; ein Anzeigename ist leichter zu lesen:
roles:
- name: admin
groups:
- local/admins
- entraid/0b6c8e1a-2f4d-4c7e-9a3b-5d1e7f2a4c6b
- name: operator
groups:
- entraid/AF-Operators
users:
- entraid/jdoe@example.com
Bis 7.2.0 war das Präfix azuread/. In einer Rolle passt es ab 7.3.0 weiterhin zu denselben Mitgliedern und wird in 8.0 entfernt; der Rolleneditor schreibt entraid/. Nur die Rollen akzeptieren entraid/: Die Gruppen des Benutzers werden als azuread/<object id> und azuread/<display name> gespeichert, und die Profilseite und die Extravar ansibleforms_user zeigen sie so. Ein Gruppenfilter wie ^AF- behält nur die Gruppen, die Ihre Rollen verwenden; siehe Rollen. Ab 7.1.0 enthält das Anmeldetoken die Gruppen nicht mehr, sodass seine Größe nicht mehr mit ihnen wächst. Der Filter ist trotzdem wichtig für Benutzer in vielen Gruppen: Bei jeder Anmeldung werden weniger Gruppen mit den Rollen abgeglichen, und der Verzeichniseintrag des Benutzers listet nur die Gruppen auf, die zählen. Vor 7.1.0 braucht ein Benutzer in hundert oder mehr Gruppen ihn, um überhaupt Formulare zu sehen, siehe Leere Formulare und Jobs nach einem Single Sign-on.
Endpunkt von Microsoft Graph
Der Server meldet Benutzer standardmäßig bei https://login.microsoftonline.com an und ruft Microsoft Graph unter https://graph.microsoft.com auf:
| Variable | Was sie ändert |
|---|---|
ENTRA_AUTHORITY_URI | Die Anmeldeautorität, für eine nationale Cloud wie https://login.microsoftonline.us |
ENTRA_GRAPH_URI | Der Graph-Endpunkt, aus dem die Gruppen gelesen werden, etwa https://graph.microsoft.us |
Beide nehmen eine Basis-URI ohne abschließenden Schrägstrich und sind neu in 7.3.0. AZURE_AUTHORITY_URI und AZURE_GRAPH_URI werden weiterhin gelesen, wenn sie nicht gesetzt sind, mit einer Warnung im Protokoll, und werden in 8.0 entfernt. Der Server muss Graph erreichen: Eine Anmeldung schlägt fehl, wenn die Gruppen nicht gelesen werden können.
Einschränkungen
Entra ID-Benutzer melden sich bei Microsoft an, daher funktionieren einige Dinge anders als bei lokalen und LDAP-Konten:
- Sie haben kein Passwort in AnsibleForms und können es dort daher nicht ändern; ein API-Token wird aus ihrer Sitzung erstellt.
- Anzeigenamen sind in Entra ID nicht eindeutig: Zwei Gruppen mit demselben Namen werden derselben Rolle zugeordnet. Benennen Sie die Gruppe in der Rolle über ihre Objekt-ID,
entraid/<object id>, damit nur diese Gruppe passt.