Sari la conținut

Referință pentru configurarea SSO

Tot ce este configurabil la autentificarea unică, într-un singur loc. Valorile stau în rândurile sso_connections din global.db (la nivel de server prin proiectare), editate prin Setări → Server → Autentificare unică sau prin operațiile RPC sso.*. Rândul salvat este singura sursă de adevăr — nu există o cale de mediu CC_SAML_* / CC_OIDC_* (o conexiune care ar putea veni din două locuri este una cu care ecranul de setări poate intra în contradicție).

Câmp Se aplică la Implicit Semnificație
enabled ambele oprit autentificările pot folosi această conexiune
idpMetadataXml SAML — XML-ul EntityDescriptor al IdP-ului (obligatoriu pentru activare)
spEntityId SAML <origin>/saml id-ul nostru de entitate, fixat atunci când originea variază
emailAttribute SAML email atributul care poartă e-mailul; un NameID în formă de e-mail este soluția de rezervă
displayNameAttribute SAML displayName atributul numelui afișat
groupsAttribute SAML groups atributul numelor de grup
clockSkewSeconds SAML 90 marja permisă pentru decalajul de ceas la validarea duratei de viață
allowIdpInitiated SAML oprit acceptă răspunsuri nesolicitate (fără InResponseTo)
wantResponseSigned SAML oprit cere o semnătură la rădăcina răspunsului (semnăturile aserțiunilor sunt mereu obligatorii)
issuer OIDC — URL-ul de bază al emitentului (obligatoriu pentru activare)
clientId OIDC — id-ul de client public (obligatoriu pentru activare)
clientSecret OIDC — doar pentru clienții confidențiali; stocat în fișierul de secrete 0600, niciodată în baza de date — doar în scriere prin RPC (sso.getConfig raportează clientSecretPresent)
groupsClaim OIDC groups revendicarea care poartă numele de grup
defaultRole ambele member rolul atunci când niciun grup nu se mapează — niciodată owner
groupRoleMap ambele {} grup → rol; mapările către proprietar sunt refuzate la salvare
autoMember ambele pornit adaugă automat utilizatorii în fiecare spațiu de lucru la prima autentificare
allowJit ambele pornit provisionează utilizatorii necunoscuți la autentificare

Conexiunile SSO nu se inițializează din mediu. Un singur steag de proces rămas se referă la predarea către browser, nu la rândul conexiunii:

Variabilă / steag Semnificație
--web-client-url / CC_SERVER_WEB_CLIENT_URL originea către care redirecționează browserul callback-urile SSO (credențialul călătorește în fragmentul URL-ului). Nesetată, predarea rămâne pe aceeași origine.

URL-ul emitentului în sine trebuie să fie https (http este acceptat doar pentru emitenți pe loopback: localhost, 127.0.0.1 și ::1).

Endpoint Autentificare Scop
GET /saml/login?relay=… fără (redirecționare) pornește autentificarea inițiată de SP; relay=desktop predă aplicației, relay=web-popup trimite prin postMessage către tab-ul de conectare în așteptare (care își declară client_origin, onorat doar când lista de permisiuni a originilor îl consideră de încredere)
POST /saml/acs fără (POST de la IdP) consumatorul de aserțiuni — verifică, provisionează, emite
GET /saml/metadata fără EntityDescriptor-ul nostru de SP
GET /oidc/login?relay=… / GET /oidc/callback fără ciclul dus-întors OIDC; relay=desktop predă aplicației, relay=web-popup tab-ului de conectare în așteptare (aceeași convenție client_origin)
GET /auth/providers fără, CORS * sonda ecranului de conectare: conexiunile SSO oferite (id/kind/label) + pairingEnabled
/scim/v2/Users… Bearer (token SCIM) Users: creare/obținere/listare+filtrare/PUT/PATCH/DELETE
/scim/v2/Groups Bearer doar citire; push-ul de grupuri răspunde 501 prin proiectare
/scim/v2/ServiceProviderConfig Bearer documentul de capabilități

Toate operațiile sso.* sunt la nivel de server și sunt restricționate la proprietarul serverului (operatorul instalării, ServerAuthority.serverOwner). Deținerea unui spațiu de lucru nu este suficientă; nici asocierea singură nu le acordă vreodată.

Operație Scop
sso.getConfig conexiunea salvată pentru un tip
sso.saveConfig validează, persistă și aplică în direct
sso.status steaguri de activare/configurare, prezența tokenului SCIM, originea canonică
sso.testConnection testează o conexiune fără ciclul dus-întors din browser (SAML: parsarea metadatelor + construirea AuthnRequest; OIDC: descoperirea emitentului), cu valori opționale nesalvate de pe ecran
sso.spMetadata emite EntityDescriptor-ul de SP pentru o origine
sso.setPairingEnabled permite/interzice asocierea manuală (coduri de invitație, chei de asociere); refuzul de a o dezactiva cât timp nu există nicio conexiune SSO funcțională protejează împotriva blocării accesului
sso.sessionPolicy citește durata maximă de viață și timeout-ul de inactivitate ale credențialului de dispozitiv al instalării (minute; 0 = nesetat)
sso.setSessionPolicy setează acele limite; aplicate la verificarea dispozitivului, nu anunțate clienților
sso.scimRegenerateToken generează + returnează bearer tokenul SCIM (o singură dată)

Eșecurile cc_saml_verify_response poartă un cod stabil:

Cod Semnificație
signature semnătură lipsă/neacceptată/manipulată sau un algoritm/transformare nepermis(ă)
expired în afara NotBefore/NotOnOrAfter (dincolo de marja de decalaj)
audience restricția de audiență nu ne numește
destination destinația răspunsului nu este ACS-ul nostru
request_match InResponseTo nu corespunde unei cereri în așteptare sau este nesolicitat cât timp acest lucru este interzis
issuer emitentul nu este IdP-ul configurat
recipient destinatarul confirmării subiectului nu este ACS-ul nostru
malformed eșec la nivel de XML/schemă
status starea raportată de IdP nu a fost Success
invalid / internal orice altceva / eșec al cusăturii
  • sso_connections (global.db) — un rând pentru fiecare tip, ÎNTRE SPAȚII DE LUCRU PRIN PROIECTARE.
  • users.sso_subject + users.sso_issuer — fixarea subiectului furnizorului, unică per (issuer, subject) printr-un index parțial.
  • users.deactivated_at — marcajul de dezactivare SCIM.
  • Bearer tokenul SCIM și client secretul OIDC stau în fișierul de secrete 0600, niciodată în baza de date.