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).
Verbindungsfelder
Abschnitt betitelt „Verbindungsfelder“| 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 |
Prozesskonfiguration
Abschnitt betitelt „Prozesskonfiguration“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).
HTTP-Endpunkte
Abschnitt betitelt „HTTP-Endpunkte“| 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 |
RPC-Operationen
Abschnitt betitelt „RPC-Operationen“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) |
Fehlercodes der Validierung
Abschnitt betitelt „Fehlercodes der Validierung“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 |
Datenbankflächen
Abschnitt betitelt „Datenbankflächen“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.