Zum Inhalt springen

SSO-Konfiguration

Alles, was sich an Single Sign-on konfigurieren lässt, an einer Stelle. Die Werte liegen in den Zeilen sso_connections von global.db (serverweit, mit Absicht), bearbeitet über Einstellungen → Server → Single sign-on oder die RPC-Operationen sso.*. Die gespeicherte Zeile ist die einzige Quelle der Wahrheit — einen Umgebungspfad CC_SAML_* / CC_OIDC_* gibt es nicht (eine Verbindung, die aus zwei Stellen kommen könnte, ist eine, mit der der Einstellungsbildschirm uneins sein kann).

Feld Gilt für Vorgabe Bedeutung
enabled beide aus Anmeldungen dürfen diese Verbindung nutzen
idpMetadataXml SAML — das EntityDescriptor-XML des IdP (erforderlich zum Aktivieren)
spEntityId SAML <origin>/saml unsere Entity-ID, festgehalten, wenn der Origin variiert
emailAttribute SAML email Attribut, das die E-Mail trägt; eine NameID in E-Mail-Form ist der Rückfall
displayNameAttribute SAML displayName Attribut für den Anzeigenamen
groupsAttribute SAML groups Attribut für die Gruppennamen
clockSkewSeconds SAML 90 Toleranz der Zeitabweichung bei der Gültigkeitsprüfung
allowIdpInitiated SAML aus unaufgeforderte Responses akzeptieren (kein InResponseTo)
wantResponseSigned SAML aus eine Signatur an der Response-Wurzel verlangen (Signaturen der Assertion sind immer erforderlich)
issuer OIDC — Basis-URL des Issuers (erforderlich zum Aktivieren)
clientId OIDC — ID des öffentlichen Clients (erforderlich zum Aktivieren)
clientSecret OIDC — nur vertrauliche Clients; liegt in der Geheimnisdatei mit Modus 0600, nie in der Datenbank — über RPC nur schreibend (sso.getConfig meldet clientSecretPresent)
groupsClaim OIDC groups Claim mit den Gruppennamen
defaultRole beide member Rolle, wenn keine Gruppe zugeordnet ist — nie owner
groupRoleMap beide {} Gruppe → Rolle; Zuordnungen auf Eigentümer werden beim Speichern abgelehnt
autoMember beide an Benutzer bei der ersten Anmeldung automatisch jedem Arbeitsbereich hinzufügen
allowJit beide an unbekannte Benutzer bei der Anmeldung provisionieren

SSO-Verbindungen werden nicht aus der Umgebung vorbelegt. Ein verbleibendes Prozess-Flag betrifft die Browser-Übergabe, nicht die Verbindungszeile:

Variable / Flag Bedeutung
--web-client-url / CC_SERVER_WEB_CLIENT_URL Origin, zu dem die Callbacks für Single Sign-on den Browser zurückschicken (das Credential liegt im URL-Fragment). Nicht gesetzt bleibt die Übergabe auf demselben Origin.

Die Issuer-URL selbst muss https sein (http ist nur für Loopback-Issuer localhost, 127.0.0.1 und ::1 zulässig).

Endpunkt Auth Zweck
GET /saml/login?relay=… keine (Redirect) startet die vom SP initiierte Anmeldung; relay=desktop übergibt an die App, relay=web-popup schickt ein postMessage an den wartenden Verbindungs-Tab (der sein client_origin meldet; das gilt nur, wenn die erlaubten Origins ihm vertrauen)
POST /saml/acs keine (IdP-POST) der Assertion Consumer — prüft, provisioniert, stellt Anmeldedaten aus
GET /saml/metadata keine unser SP-EntityDescriptor
GET /oidc/login?relay=… / GET /oidc/callback keine der OIDC-Roundtrip; relay=desktop übergibt an die App, relay=web-popup an den wartenden Verbindungs-Tab (dieselbe Konvention für client_origin)
GET /auth/providers keine, CORS * die Abfrage des Verbindungsbildschirms: angebotene SSO-Verbindungen (id/kind/label) plus pairingEnabled
/scim/v2/Users… Bearer (SCIM-Token) Users anlegen/abrufen/listen und filtern/PUT/PATCH/DELETE
/scim/v2/Groups Bearer nur lesend; ein Gruppen-Push antwortet absichtlich mit 501
/scim/v2/ServiceProviderConfig Bearer Dokument der unterstützten Fähigkeiten

Alle Operationen sso.* sind serverweit und dem Server-Eigentümer vorbehalten (dem Betreiber der Installation, ServerAuthority.serverOwner). Einen Arbeitsbereich zu besitzen reicht nicht; die Kopplung allein gewährt sie nie.

Operation Zweck
sso.getConfig die gespeicherte Verbindung eines Typs
sso.saveConfig prüfen, speichern und sofort anwenden
sso.status Flags für aktiviert und konfiguriert, ob ein SCIM-Token vorliegt, kanonischer Origin
sso.testConnection eine Verbindung prüfen, ohne den Browser-Roundtrip (SAML: Metadaten parsen und AuthnRequest bauen; OIDC: Discovery des Issuers), optional mit noch nicht gespeicherten Werten vom Bildschirm
sso.spMetadata den SP-EntityDescriptor für einen Origin ausgeben
sso.setPairingEnabled manuelle Kopplung erlauben oder verbieten (Einladungscodes, Kopplungsschlüssel); der Aussperrschutz lehnt das Abschalten ab, solange keine funktionierende SSO-Verbindung besteht
sso.sessionPolicy maximales Sitzungsalter und Inaktivitätszeitlimit der Installation lesen (Minuten; 0 = nicht gesetzt)
sso.setSessionPolicy diese Grenzen setzen; durchgesetzt bei der Prüfung der Geräteanmeldedaten, den Clients nicht bekannt gegeben
sso.scimRegenerateToken das SCIM-Bearer-Token erzeugen und zurückgeben (einmal)

Fehler von cc_saml_verify_response tragen einen stabilen Code:

Code Bedeutung
signature fehlende, nicht vertrauenswürdige oder verfälschte Signatur, oder ein unzulässiger Algorithmus bzw. eine unzulässige Transform
expired außerhalb von NotBefore/NotOnOrAfter (jenseits der Zeitabweichung)
audience die Audience-Einschränkung nennt uns nicht
destination das Ziel der Response ist nicht unsere ACS
request_match InResponseTo passt zu keinem offenen Request, oder die Antwort ist unaufgefordert, obwohl das verboten ist
issuer der Issuer ist nicht der konfigurierte IdP
recipient der Empfänger der Subject Confirmation ist nicht unsere ACS
malformed Fehler auf XML- oder Schema-Ebene
status der vom IdP gemeldete Status war nicht Success
invalid / internal alles andere / Fehler an der Nahtstelle
  • sso_connections (global.db) — eine Zeile je Art, CROSS-WORKSPACE BY DESIGN.
  • users.sso_subject + users.sso_issuer — die Festschreibung des Anbieter-Subjects, eindeutig je (issuer, subject) über einen partiellen Index.
  • users.deactivated_at — der Stempel der SCIM-Deaktivierung.
  • Das SCIM-Bearer-Token und das OIDC-Client-Secret liegen in der Geheimnisdatei mit Modus 0600, nie in der Datenbank.