Passa al contenuto principale

OpenID Connect

Semaphore supporta l'autenticazione tramite OpenID Connect (OIDC).

Collegamenti:

Esempio di configurazione di un provider SSO:

{
"oidc_providers": {
"mysso": {
"display_name": "Sign in with MySSO",
"color": "orange",
"icon": "login",
"provider_url": "https://mysso-provider.com",
"client_id": "***",
"client_secret": "***",
"redirect_url": "https://your-domain.com/api/auth/oidc/mysso/redirect"
}
}
}

Configurazione tramite variabile d'ambiente

Quando si esegue in container, può essere comodo configurare i provider tramite un'unica variabile d'ambiente:

SEMAPHORE_OIDC_PROVIDERS='{
"github": {
"client_id": "***",
"client_secret": "***"
}
}'

Questo valore deve essere una stringa JSON valida corrispondente alla struttura oidc_providers mostrata sopra.

Tutte le opzioni del provider SSO:

ParametroDescrizione
display_nameNome del provider visualizzato nella schermata di accesso.
iconIcona MDI visualizzata prima del nome del provider nella schermata di accesso.
colorNome del provider visualizzato nella schermata di accesso.
client_idClient ID del provider.
client_id_filePercorso del file in cui è memorizzato il client ID del provider. Ha priorità inferiore rispetto a client_id.
client_secretClient secret del provider.
client_secret_filePercorso del file in cui è memorizzato il client secret del provider. Ha priorità inferiore rispetto a client_secret.
redirect_url
provider_url
scopes
username_claimEspressione del claim per il nome utente*.
email_claimEspressione del claim per l'email*.
name_claimEspressione del claim per il nome del profilo*.
orderPosizione del pulsante del provider nella schermata di accesso.
allow_idp_initiatedAbilita l'accesso avviato dall'IdP per questo provider. Valore predefinito false.
return_via_statePassa il percorso di ritorno post-accesso tramite il parametro OAuth state invece che tramite l'URL di redirect. Valore predefinito true.
endpoint.issuer
endpoint.auth
endpoint.token
endpoint.userinfo
endpoint.jwks
endpoint.algorithms

*Espressione del claim

Esempio di espressione del claim:

email | {{ .username }}@your-domain.com

Semaphore tenta prima di ottenere il campo email. Se questo è vuoto, viene valutata l'espressione successiva.

L'espressione "username_claim": "|" genera uno username casuale per ogni utente che accede tramite il provider.

Accesso avviato dall'IdP

Per impostazione predefinita Semaphore supporta solo l'accesso avviato dall'SP: l'utente apre Semaphore, fa clic sul pulsante del provider e viene reindirizzato all'identity provider (IdP).

Con l'accesso avviato dall'IdP il percorso può invece iniziare dall'identity provider, ad esempio facendo clic sul riquadro di Semaphore nella dashboard di Okta, in My Apps di Azure o in un launcher di applicazioni di Keycloak / Authentik.

Semaphore implementa questa funzionalità tramite il meccanismo standard Third-Party Initiated Login (OpenID Connect Core 1.0 §4). L'IdP reindirizza il browser a un Initiate Login URI dedicato e Semaphore avvia quindi un normale flusso Authorization Code. L'autenticazione vera e propria rimane uno scambio di codice completo e sicuro: Semaphore non accetta mai un token non richiesto.

Abilitazione

Impostare allow_idp_initiated a true per il provider:

{
"oidc_providers": {
"mysso": {
"display_name": "Sign in with MySSO",
"provider_url": "https://mysso-provider.com",
"client_id": "***",
"client_secret": "***",
"redirect_url": "https://your-domain.com/api/auth/oidc/mysso/redirect",
"allow_idp_initiated": true
}
}
}

Configurazione dell'identity provider

Nel proprio IdP, impostare l'Initiate Login URI dell'applicazione a:

https://your-domain.com/api/auth/oidc/<provider-id>/initiate

dove <provider-id> è la chiave sotto oidc_providers (ad esempio mysso).

L'IdP deve inviare a questo endpoint il parametro iss (issuer); Semaphore rifiuta le richieste il cui iss non corrisponde al provider configurato. Il parametro opzionale login_hint viene inoltrato all'IdP e il parametro opzionale target_link_uri imposta la pagina da aprire dopo l'accesso (deve puntare a Semaphore, altrimenti viene ignorato).

Note specifiche per provider:

  • Okta — impostare Login initiated by su Either Okta or App (oppure App Only) e compilare Initiate login URI. Okta invia sia iss sia target_link_uri.
  • Keycloak / Authentik / Ping / OneLogin — impostare l'URL di avvio / home dell'applicazione sull'Initiate Login URI.
  • Azure AD / EntraMy Apps utilizza un URL di avvio SP-initiated e non invia sempre iss; puntare invece l'URL di avvio a https://your-domain.com/api/auth/oidc/<provider-id>/login.

Sicurezza

  • L'accesso avviato dall'IdP è disattivato per impostazione predefinita e deve essere abilitato per ogni provider.
  • Il parametro iss viene convalidato rispetto all'issuer configurato per prevenire confusioni tra provider.
  • target_link_uri viene accettato solo se punta a Semaphore (nessun open redirect).
  • Il flusso passa attraverso lo scambio Authorization Code completo con state CSRF e un nonce, quindi un token intercettato o riutilizzato non può essere usato per accedere.

Schermata di accesso

Per ciascuno dei provider configurati, alla pagina di accesso viene aggiunto un ulteriore pulsante di accesso:

Screenshot della pagina di accesso di Semaphore, con due pulsanti di accesso. Uno riporta "Sign In", l'altro "Sign in with MySSO"