OIDC
Single Sign-on mit einem OpenID Connect-Anbieter wie Keycloak, mit Rollen aus einem Gruppen-Claim
- Funktionsweise
- Anforderungen an den Anbieter
- Beispiel für Keycloak
- Den Anbieter hinzufügen
- Zuordnung zu Rollen
- Einschränkungen
Funktionsweise
Ist ein OIDC-Anbieter aktiviert, zeigt die Anmeldeseite unter Anmelden eine OpenID-Schaltfläche. Eine Anmeldung läuft dann so ab:
- Die Schaltfläche schickt den Browser zu
/api/v2/auth/oidc, das ihn zum Anbieter weiterleitet (Authorization Code Flow mit PKCE). - Der Benutzer meldet sich beim Anbieter an, der zur Umleitungs-URL zurückleitet.
- Der Server tauscht den Code gegen Token und liest die Claims des ID-Tokens.
- Der Benutzername ist der Claim
preferred_username, und jeder Wert des Claimsgroups, der den Gruppenfilter passiert, wird zu einer Gruppeoidc/<value>.
AnsibleForms fordert die Scopes openid profile email an; die Scopes sind nicht konfigurierbar. Das Abmelden von AnsibleForms schickt den Browser außerdem zum End-Session-Endpunkt des Anbieters, sofern der Anbieter einen veröffentlicht.
OIDC wurde mit Keycloak getestet. Andere Anbieter funktionieren, wenn sie die folgenden Anforderungen erfüllen.
Anforderungen an den Anbieter
Der Anbieter muss OpenID Connect Discovery und einen vertraulichen Client für AnsibleForms anbieten:
- Discovery: AnsibleForms liest
<issuer>/.well-known/openid-configuration, daher muss der Issuer vom AnsibleForms-Server aus über HTTPS erreichbar sein. - Ein vertraulicher Client mit dem Authorization Code Flow, einer Client-ID und einem Client-Secret.
- Der Redirect URI
https://af.example.com/api/v2/auth/oidc/callback, also die Adresse, unter der Benutzer AnsibleForms erreichen, gefolgt von/api/v2/auth/oidc/callback. MitBASE_URL/formswird daraushttps://af.example.com/forms/api/v2/auth/oidc/callback. - Ein Claim
groupsim ID-Token, der eine Liste von Gruppennamen enthält. Ohne ihn erhält der Benutzer keine OIDC-Gruppen. - Ein Claim
preferred_username, der zum Benutzernamen wird.
Beispiel für Keycloak
Dieses Beispiel verwendet ein Realm example auf https://keycloak.example.com; der Issuer ist dann https://keycloak.example.com/realms/example. In diesem Realm:
- Erstellen Sie unter Clients einen OpenID Connect-Client mit der Client-ID
ansibleforms. Schalten Sie Client authentication ein, behalten Sie Standard flow bei und setzen Sie Valid redirect URIs aufhttps://af.example.com/api/v2/auth/oidc/callback. - Kopieren Sie im Tab Credentials des Clients das Client secret.
- Öffnen Sie im Tab Client scopes
ansibleforms-dedicatedund fügen Sie einen Mapper By configuration > Group Membership hinzu, mit Token Claim Namegroups, Full group path aus und Add to ID token ein.
Mit eingeschaltetem Full group path enthält der Claim Pfade wie /af-admins, und die Rolle muss dann oidc//af-admins verwenden.
Den Anbieter hinzufügen
Fügen Sie den Anbieter unter Zugriff > SSO hinzu: Ein Assistent fragt seine Felder in vier Schritten ab, mit Open ID im Schritt Typ:
| Schritt | Feld | Bedeutung |
|---|---|---|
| Details | Name, Beschreibung | Ein eindeutiger Name für den Anbieter und eine optionale Beschreibung |
| Typ | Anbieter | Open ID; beim Anlegen festgelegt, bleibt er so |
| Anmeldedaten | Anmeldedaten-Eintrag | Ein Open ID-Eintrag aus Verbindungen > Anmeldedaten, siehe unten |
| Gruppen | Gruppenfilter | Regulärer Ausdruck; nur die passenden Werte des Claims groups bleiben erhalten. Leer behält jede Gruppe |
Die Anmeldedaten enthalten den Client, daher kann nur ein Admin sie hinzufügen oder ändern:
| Feld | Bedeutung |
|---|---|
| Issuer | Erforderlich. Die Issuer-URL, z. B. https://keycloak.example.com/realms/example |
| Client-ID | Die Client-ID beim Anbieter, z. B. ansibleforms |
| Client-Secret | Das Client-Secret, verschlüsselt gespeichert oder aus einem Secret Store gelesen |
| Umleitungs-URI | Wie registriert, z. B. https://af.example.com/api/v2/auth/oidc/callback. Leer: die URL der App und der Callback-Pfad |
Bis 7.2.0 waren Issuer, 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 OIDC-Anbieter aktiviert, der, mit dem sich die OpenID-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 des Anbieters wendet ihn sofort an. Ist der Issuer nicht erreichbar, protokolliert der Server Failed to initialize OIDC strategy, und OIDC-Anmeldungen schlagen fehl, bis der Anbieter erneut gespeichert oder der Server neu gestartet wird.
Zuordnung zu Rollen
In config.yaml ist eine OIDC-Gruppe oidc/<group> und ein Benutzer oidc/<preferred_username>:
roles:
- name: admin
groups:
- local/admins
- oidc/af-admins
- name: operator
groups:
- oidc/af-operators
users:
- oidc/jdoe
Die Werte werden exakt abgeglichen, einschließlich der Groß- und Kleinschreibung. Siehe Rollen für die Rollenoptionen.
Einschränkungen
OIDC-Benutzer melden sich beim Anbieter 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; ab 7.2.0 wird ein API-Token aus ihrer Sitzung erstellt.
- Halten Sie den Claim
groupskurz: Senden Sie nur die Gruppen, die für AnsibleForms wichtig sind, etwa mit einem eigenen Client-Scope oder einer Gruppenstruktur beim Anbieter, oder filtern Sie sie mit dem Gruppenfilter. Ab 7.1.0 enthält das Anmeldetoken von AnsibleForms die Gruppen nicht mehr; vorher konnte ein Benutzer in hundert oder mehr Gruppen keine Formulare sehen, siehe Leere Formulare und Jobs nach einem Single Sign-on.