SSO per app interne: mappa i claim SAML/OIDC su ruoli e team
SSO per app interne più sicuro: mappa i claim SAML o OIDC su ruoli e team, collega gli account e imposta default quando i dati mancano.

Perché la mappatura dei claim è importante per le app interne
Single sign-on sembra semplice: clicchi "Sign in with Okta" o "Sign in with Azure AD" e accedi. La parte difficile è quello che succede dopo. Senza una mappatura chiara dei claim, le persone finiscono con troppo accesso (un agente support vede le buste paga) o troppo poco accesso (un neoassunto non può aprire lo strumento necessario il primo giorno).
Le app interne sono più complicate delle app pubbliche perché sono condivise tra team e cambiano continuamente. Uno stesso strumento può essere usato da Support, Finance e Sales contemporaneamente. L'organigramma cambia, i contractor vanno e vengono, e i team vengono rinominati o divisi. Se le regole di accesso vivono solo nelle teste delle persone, l'SSO copierà fedelmente quel caos nella tua app.
La mappatura dei claim è il modo in cui trasformi i dati di identità provenienti dall'identity provider (IdP), come gruppi, reparto o titolo, in permessi che la tua app capisce. Questo di solito significa decidere:
- Quali ruoli esistono nell'app (admin, manager, viewer, ecc.)
- A quali team o workspace appartengono gli utenti
- Cosa può fare ogni ruolo e cosa può vedere ogni team
- Chi ottiene accesso automaticamente e chi necessita approvazione
Due rischi causano la maggior parte dei problemi:
- Mappature errate. Un nome di gruppo corrisponde al ruolo sbagliato o un ampio gruppo "All Employees" concede per errore diritti admin.
- Claim mancanti. L'IdP non invia i gruppi per alcuni utenti, un attributo è vuoto o il token è troppo grande e viene tagliato.
La tua app ha bisogno di default sicuri in modo che dati mancanti o inattesi non si trasformino mai in accessi accidentali.
SAML vs OIDC in termini semplici
Quando effettui l'accesso con SSO, il tuo IdP invia alla tua app un piccolo pacchetto di fatti su di te. Ogni fatto è un claim, fondamentalmente un campo etichettato come "email = [email protected]" o "department = Finance".
SAML e OIDC possono trasportare fatti simili, ma li impacchettano in modo diverso.
SAML è comune negli ambienti enterprise più datati. Di solito invia un documento XML (una assertion) con attributi. Quegli attributi sono i claim che la tua app legge.
OIDC è più recente e costruito su OAuth 2.0. Tipicamente invia un token JSON firmato (ID token) più eventuale user info, dove i campi all'interno del token sono i claim.
Per le app interne di solito ti interessa un piccolo insieme di claim:
- Indirizzo email
- Un ID utente stabile dall'IdP (subject)
- Nome completo (o nome e cognome)
- Appartenenze a gruppi (team, security group)
- Reparto o titolo di lavoro
Una distinzione evita molte confusioni:
L'autenticazione risponde a "chi è questo utente?". Claim come un ID utente stabile e l'email ti aiutano a collegare il login SSO all'account giusto.
L'autorizzazione risponde a "cosa può fare?". Claim come gruppi o reparto ti aiutano a mappare l'utente su ruoli e team dentro l'app.
Due persone possono autenticarsi con successo, ma solo quella con il claim "Finance" dovrebbe essere autorizzata ad accedere a una schermata di fatturazione.
Ruoli e team: decidi cosa stai mappando
Prima di mappare attributi SAML o convertire claim OIDC in permessi, chiarisci due cose diverse che la tua app deve sapere:
- I ruoli definiscono cosa qualcuno può fare (permessi).
- I team definiscono dove appartiene (scope).
I ruoli rispondono a domande come: questa persona può vedere, modificare, approvare, esportare, gestire utenti o cambiare impostazioni?
I team rispondono a domande come: in quale reparto, regione, coda o centro di costo lavora questa persona e quali record dovrebbe vedere?
Mantieni i ruoli piccoli e stabili. La maggior parte delle app interne ha bisogno solo di pochi ruoli che cambiano raramente, anche quando le persone si spostano. I team dovrebbero riflettere la realtà quotidiana: Support Tier 2, copertura EMEA, un proprietario di coda temporaneo.
Least privilege è il default più sicuro. Molte app interne funzionano bene con tre ruoli:
- Viewer: può leggere dati ed eseguire ricerche
- Editor: può creare e aggiornare record
- Admin: può gestire impostazioni, utenti e regole di accesso
Scrivi in linguaggio semplice cosa permette ogni ruolo. Questo evita "admin a sorpresa" quando un nome di gruppo cambia e rende le revisioni molto più semplici in seguito.
Accesso basato sui gruppi: come pensare ai gruppi dell'IdP
L'accesso basato sui gruppi significa che la tua app non decide i permessi persona per persona. Invece si affida all'IdP per mantenere l'appartenenza ai gruppi e la tua app mappa quei gruppi su ruoli e team.
Inizia decidendo cosa concede un gruppo. In molti strumenti, un gruppo mappa a un ruolo (come "Support Agent") e opzionalmente a un team (come "Tier 2"). La chiave è che la mappatura resti noiosa e prevedibile: lo stesso gruppo significa sempre lo stesso accesso.
Quando gli utenti sono in più gruppi
Le persone spesso appartengono a più gruppi IdP. Hai bisogno di una regola per risolvere questo e devi mantenerla stabile.
Approcci comuni:
- Regole additive: combina i permessi di tutti i gruppi corrispondenti (funziona quando i permessi sono strettamente circoscritti)
- Regole di priorità: scegli il gruppo con priorità più alta e ignora gli altri (utile quando i ruoli confliggono)
- Ibrido: additivo per i team, priorità per i ruoli
Qualunque cosa tu scelga, documentala. Cambiarla dopo può far guadagnare o perdere accesso agli utenti all'improvviso.
Usa una convenzione di naming scalabile
Nomi di gruppo chiari riducono gli errori e facilitano le verifiche. Un pattern pratico è:
- -
Per esempio, support-tool-prod-agent o finance-tool-staging-viewer. Questo ti aiuta a evitare di riutilizzare nomi vaghi come "Admins" tra più app.
Se un utente non appartiene a nessun gruppo rilevante, imposta il default su nessun accesso (o uno stato guest chiaramente limitato) e mostra un messaggio che spiega come richiedere l'accesso.
Account linking: associare gli utenti SSO agli account dell'app
L'SSO dimostra chi è una persona, ma la tua app deve comunque decidere a quale account esistente collegare quell'identità. Senza account linking, la stessa persona può finire con account multipli nel tempo perché gli identificatori cambiano: nuova email, aggiornamenti del nome, spostamenti tra controllate, cambio di IdP.
Scegli una chiave stabile e unica come corrispondenza primaria.
- Per OIDC, questo è di solito il claim
subdell'IdP (subject). - Per SAML, spesso è un NameID persistente o un attributo utente immutabile dedicato.
Memorizza quel valore come "IdP user ID" insieme all'issuer/entity ID dell'IdP, così lo stesso sub da un IdP diverso non può collidere.
L'email è utile, ma trattala come chiave di comodità, non come fonte di verità. Le persone cambiano email per rinomi, migrazioni di dominio o fusioni. Alias e caselle condivise possono anche creare corrispondenze sorprendenti. Se fai match tramite email, fallo solo quando il segnale dall'IdP è verificato e considera un passaggio di conferma una-tantum.
Al primo login, la maggior parte degli strumenti interni sceglie uno dei seguenti pattern di onboarding:
- Auto-create: crea immediatamente un account e assegna accesso minimo.
- Invite-only: permetti il login solo a utenti pre-creati (o pre-approvati) nell'app.
- Approval flow: crea l'account, ma blocca l'accesso finché un manager o un admin non approva ruolo/team.
Un default sicuro è auto-create senza permessi di default, poi concedere accesso basato sui gruppi o tramite un passaggio di approvazione.
Passo dopo passo: mappa i claim su ruoli e team
Una buona mappatura dei claim fa sembrare l'SSO invisibile: le persone accedono e si trovano nel posto giusto con il giusto accesso.
Inizia scrivendo il tuo modello di accesso in linguaggio semplice. Elenca ogni ruolo (Viewer, Agent, Manager, Admin) e ogni team (Support, Finance, IT), più chi dovrebbe ottenerli e perché.
Poi conferma cosa l'IdP può effettivamente inviare. Per SAML o OIDC vuoi tipicamente un ID utente stabile (subject o NameID), email e uno o più attributi di gruppo. Registra i valori esatti dei gruppi così come appaiono, includendo case e prefissi. "Support" e "support" non sono la stessa cosa.
Un flusso pratico:
- Definisci ruoli e team, e assegna un owner per ciascuno (qualcuno che possa approvare le modifiche).
- Elenca i claim disponibili e i nomi esatti dei gruppi dall'IdP, compresi i casi limite (contractor, caselle condivise).
- Scrivi le regole di mapping: group-to-role, group-to-team e un ordine di override quando più gruppi corrispondono.
- Testa con 3-5 tipi di utenti reali (neoassunto, manager, contractor, admin) usando account IdP reali.
- Per ogni utente di test, scrivi prima il risultato atteso ruolo/team, poi effettua il login e confronta.
Tieni un piccolo esempio per rendere le regole concrete. Se un utente è in "okta-support", diventa team Support con ruolo Agent. Se è anche in "okta-support-managers", il ruolo Manager sovrascrive Agent.
Infine, aggiungi un modo semplice per il debug. Logga i claim grezzi ricevuti (in modo sicuro), le regole che hanno corrisposto e il risultato finale ruolo/team. Quando qualcuno dice "Ho effettuato l'accesso ma non vedo il mio strumento", questo trasforma un gioco d'ipotesi in un controllo rapido.
Default sicuri quando i claim mancano
I claim mancanti sono normali. L'IdP potrebbe non inviare i gruppi per account di servizio, un connettore potrebbe omettere un campo o un utente potrebbe essere a metà migrazione. Tratta "assenza di dati" come "assenza di fiducia".
Il default più sicuro è deny-by-default: nessun ruolo, nessun team, nessun accesso. Se devi permettere l'ingresso in modo che qualcuno possa richiedere accesso, mantienilo in sola lettura e chiaramente limitato.
Scegli un comportamento e documentalo:
- Blocca il login con un messaggio chiaro: "Il tuo account non ha accesso assegnato. Contatta il supporto."
- Consenti accesso limitato con un avviso e disabilita azioni sensibili.
- Crea il record utente ma assegna nessun ruolo o team finché non viene approvato.
Mai impostare come default l'admin, neanche temporaneamente.
Pianifica per dati parziali. Se ricevi un'email ma non i gruppi, puoi comunque creare un account e inviarlo in approvazione. Se ricevi gruppi ma nessun identificatore stabile, evita l'auto-linking a un account esistente poiché questo può collegare la persona sbagliata.
Prevedi una via di escalation per i casi falliti:
- Un owner nominato (IT o admin dell'app) che possa approvare l'accesso
- Un flusso di assegnazione manuale del ruolo con nota di audit
- Un modo per ricontrollare i claim al prossimo login
- Un timeout per gli account con "accesso in sospeso"
Gestire cambi, rimozioni e offboarding
Le persone cambiano team, cambiano manager e lasciano l'azienda. Il tuo setup SSO dovrebbe trattare questo come normale.
Quando qualcuno cambia team, aggiorna l'accesso al prossimo login: rivaluta i group claim e applica la mappatura corrente. Evita accessi "appiccicosi" che rimangono perché una volta sono stati concessi.
I partenti sono diversi. Aspettare il prossimo login non è sufficiente. Vuoi che il loro accesso termini rapidamente, anche se hanno sessioni attive. Questo significa di solito disabilitare l'account nell'IdP, e la tua app dovrebbe trattare un'identità disabilitata o mancante come bloccata immediatamente.
Il deprovisioning dovrebbe essere prevedibile: disabilita l'utente, rimuovi le appartenenze ai team e conserva i dati di audit. Spesso devi preservare record come approvazioni, commenti e storico per compliance, mentre blocchi nuove azioni.
I contractor e gli accessi temporanei meritano attenzione extra. Inseriscili in gruppi con durata nell'IdP o allega una data di revisione al loro ruolo così l'accesso non rimanga dopo la fine del progetto.
Una policy pratica di offboarding:
- Ricontrolla i claim ad ogni login e aggiorna l'appartenenza ai team dall'IdP
- Quando un utente viene rimosso dai gruppi richiesti, riduci i privilegi immediatamente (al prossimo login o alla prossima sync)
- Disabilita l'account preservando le tracce di audit e la storia delle proprietà
- Richiedi una data di fine per gli accessi contractor e rivedila prima del rinnovo
- Esegui revisioni periodiche degli accessi per ruoli sensibili come finance o admin
Errori comuni e trappole da evitare
La maggior parte degli outage SSO non è causata dal fatto che SAML o OIDC siano "difficili". Accadono perché l'app fa assunzioni insicure su persone, gruppi e identificatori.
Un errore comune è mescolare la mappatura dei ruoli con la mappatura dei team. I ruoli sono "cosa puoi fare?" I team sono "dove appartieni?" Se mappi un gruppo di team direttamente a un ruolo potente come Admin, spesso concedi accesso ampio a chiunque si trovi in quel team.
Un'altra trappola è affidarsi all'email come unico identificatore per l'account linking. Le email cambiano e alias possono creare duplicati. Preferisci un IdP user ID stabile (come subject/NameID) come chiave primaria e tratta l'email come campo di visualizzazione e notifica.
Altri problemi frequenti:
- Aprirsi quando mancano i gruppi (default su nessun accesso o basso accesso, non pieno accesso)
- Nomi di gruppo poco chiari riutilizzati tra dev, staging e production
- Trattare l'appartenenza a gruppi come una lista di permessi senza rivedere cosa significa ciascun gruppo
- Non gestire utenti multi-team che necessitano accesso a più aree senza diventare admin
- Dimenticare partner e contractor che dovrebbero essere isolati dai team riservati ai dipendenti
Testa i casi limite prima del lancio. Un analista finanziario in incident response potrebbe aver bisogno di due team e un ruolo elevato. Se le tue regole permettono solo un team, perderà accesso o otterrà permessi eccessivi.
Checklist rapida prima del go-live
Prima di abilitare l'SSO per tutti, fai una prova con alcuni account di test di ogni team. La maggior parte dei problemi di accesso emerge immediatamente quando testi un neoassunto, un cambio di ruolo e un caso di offboarding.
Inizia con l'account linking. Scegli un identificatore unico che non cambi nel tempo e mantienilo. In OIDC di solito è sub. In SAML spesso è NameID o un attributo immutabile specifico.
Poi decidi cosa succede quando mancano i claim. Il default più sicuro è nessun accesso elevato (e in molte app, nessun accesso) quando i claim di gruppo o ruolo sono assenti o vuoti. Assicurati di avere almeno un ruolo a basso privilegio che permetta alle persone di entrare senza esporre azioni sensibili, se questo si adatta al tuo flusso di lavoro.
Una semplice checklist pre-lancio:
- Conferma che l'identificatore per il linking sia stabile e unico (e che sia visibile nei log)
- Verifica che claim di gruppo mancanti non concedano accessi oltre un ruolo a basso privilegio
- Richiedi che l'accesso admin corrisponda a un gruppo admin esplicito, più un secondo passaggio di approvazione (anche manuale)
- Testa la rimozione: quando un utente esce da un gruppo, l'accesso scende al prossimo login (o alla prossima sync)
- Scrivi le regole di mapping in modo che un collega le capisca in una pagina
Esempio: uno strumento operativo per support e finance con gruppi SSO
Immagina uno strumento operativo usato quotidianamente da Support, Finance e alcuni manager. Vuoi che le persone accedano e ottengano subito le schermate e le azioni giuste senza che un admin sistemi manualmente gli account.
Crea alcuni gruppi IdP e mappali a ruoli e team in-app:
ops-support-> Ruolo: Support Agent, Team: Supportops-finance-> Ruolo: Finance Analyst, Team: Financeops-managers-> Ruolo: Manager, Team: Management
Ecco come si svolge.
| User | IdP identifier used for linking | IdP groups claim | In-app result | Notes |
|---|---|---|---|---|
| Maya (Support) | sub=00u8...k3 | ops-support | Support Agent, Support team | Può visualizzare ticket, rispondere e taggare issue. Non vede le pagine di billing. |
| Omar (Manager) | sub=00u2...p9 | ops-support, ops-managers | Manager, Management team | Le regole di mapping scelgono il ruolo più alto mantenendo Finance separato. |
| Lina (Finance) | sub=00u5...w1 | Missing (group claim not sent) | Default: No Access (o Read-only Guest) | Default sicuro previene l'over-access. Lina vede: "Accesso non assegnato. Contatta l'admin." |
Ora un caso di cambio email: Omar cambia da [email protected] a [email protected]. Poiché l'app collega gli account usando l'IdP user ID stabile (come sub per OIDC, o un NameID persistente per SAML) invece dell'email, non ottiene un account duplicato. Mantiene la stessa storia e la stessa traccia di audit.
Per verificare l'accesso senza ipotesi, mantieni una vista "effective access" che mostra l'identità IdP collegata dell'utente, i gruppi ricevuti, il ruolo risultante e il team. Quando qualcosa non quadra, puoi rapidamente capire se è un problema dell'IdP, una regola di mapping o un claim mancante.
Prossimi passi: mantenere l'accesso prevedibile mentre l'organizzazione cambia
La parte più difficile non è il primo lancio. È mantenere l'accesso sensato dopo riorganizzazioni, nuovi team e eccezioni "temporanee".
Tieni un documento di mapping su una pagina che risponda:
- Quali gruppi IdP mappano a quali ruoli e team in-app
- Qual è il default quando manca un claim (e chi approva le modifiche)
- Chi possiede ogni ruolo ad alto rischio (finance admin, user admin, export dati)
- Come vengono gestiti contractor e account di servizio
- Dove risiede la fonte di verità (IdP vs app)
Esegui un piccolo pilot con un dipartimento che ha confini chiari, risolvi i casi limite, poi espandi senza inventare regole nuove. Imposta una revisione ricorrente per gli accessi che possono arrecare danno reale: mensile per admin e ruoli ad alto rischio, trimestrale per i ruoli normali.
Se stai costruendo l'app interna da solo, aiuta quando ruoli, team e logica di business vivono vicini in modo che le modifiche siano facili da testare. AppMaster (appmaster.io) è un'opzione per team che vogliono modellare ruoli e workflow visivamente e rigenerare codice backend, web e mobile reale man mano che i requisiti cambiano, senza accumulare fix one-off ai permessi.
FAQ
Il claim mapping è il passaggio in cui traduci ciò che l'identity provider invia (come gruppi, reparto o titolo) nei ruoli e nei team che la tua app usa per il controllo accessi. Senza di esso, gli utenti possono ricevere permessi sbagliati anche se l'accesso SSO riesce.
Un buon default è deny-by-default: riconosci o crea l'utente, ma non assegnare ruolo né team finché non esiste una corrispondenza nota. Se serve un punto di ingresso per “richiedi accesso”, mantienilo chiaramente limitato e non trattare mai dati mancanti come permessi.
Usa una chiave di identità stabile e immutabile fornita dall'IdP come corrispondenza primaria, ad esempio il claim OIDC sub o un NameID/attributo persistente in SAML. Memorizzala insieme all'issuer/entity ID dell'IdP in modo che lo stesso sub proveniente da un altro IdP non possa collidere.
Usa l'email come attributo di comodità, non come fonte di verità: può cambiare per rinomi, migrazioni di dominio o fusioni. Se fai corrispondenze basate su email, fallo solo con forte verifica dall'IdP e considera un passaggio di conferma una-tantum per evitare di collegare la persona sbagliata.
I ruoli definiscono cosa può fare qualcuno — per esempio modificare, approvare, esportare o gestire utenti. I team definiscono a quale ambito di dati appartiene — reparto, regione, coda o centro di costo — e cosa può vedere.
Un punto di partenza semplice sono tre ruoli: Viewer, Editor e Admin, con definizioni chiare e scritte. Mantenere i ruoli ridotti e stabili riduce gli errori quando cambiano le strutture organizzative o i nomi dei gruppi.
Scegli una regola di risoluzione coerente e documentala in modo che l'accesso non cambi in modo imprevedibile. Molti team usano un approccio ibrido: l'appartenenza ai team è additiva mentre il ruolo viene scelto per priorità per evitare conflitti.
Una convenzione pratica è includere il nome dell'app, l'ambiente e il ruolo nel nome del gruppo in modo che sia ovvio quale accesso concede. Questo evita gruppi vaghi come “Admins” riutilizzati tra più app o applicati per errore in produzione.
Registra abbastanza informazioni da vedere quali claim sono arrivati, quali regole di mapping sono state applicate e il ruolo/team finale assegnato, senza esporre contenuti sensibili del token. Questo trasforma “non vedo lo strumento” in un controllo rapido di claim vs regole.
Rivaluta i claim ad ogni login o con una sincronizzazione regolare in modo che i cambi di accesso seguano l'attuale appartenenza ai gruppi invece di rimanere “appiccicati”. Per il deprovisioning, non aspettare il prossimo login: assicurati che la disabilitazione nell'IdP blocchi immediatamente l'accesso e che l'app preservi la cronologia di audit bloccando nuove azioni.


