Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisione Revisione precedente Prossima revisione | Revisione precedente | ||
guide_pubbliche:howto:identity:shibbolethsp_config [2024/04/09 09:37] riccardo.cappone@unipr.it [Autenticazione con SPID] |
guide_pubbliche:howto:identity:shibbolethsp_config [2024/10/25 07:45] (versione attuale) riccardo.cappone@unipr.it [Table] |
||
---|---|---|---|
Linea 39: | Linea 39: | ||
* attributeID="uniprId" | * attributeID="uniprId" | ||
* attributeID="organizationalUnit" | * attributeID="organizationalUnit" | ||
+ | |||
+ | * samlSubjectID => urn:oasis:names:tc:SAML:attribute:subject-id | ||
+ | * samlPairwiseID => urn:oasis:names:tc:SAML:attribute:pairwise-id | ||
+ | |||
Lato Service Provider configurare opportunamente l'attribute-map.xml per recepire gli attributi rilasciati:\\ | Lato Service Provider configurare opportunamente l'attribute-map.xml per recepire gli attributi rilasciati:\\ | ||
Linea 63: | Linea 67: | ||
* uniprID -> <Attribute name="urn:oid:1.3.6.1.4.14657.1.1.3.42" id="uniprID"/> | * uniprID -> <Attribute name="urn:oid:1.3.6.1.4.14657.1.1.3.42" id="uniprID"/> | ||
* organizationalUnit -> <Attribute name="urn:oid:2.5.4.11" id="organizationalUnit"/> | * organizationalUnit -> <Attribute name="urn:oid:2.5.4.11" id="organizationalUnit"/> | ||
+ | |||
+ | * samlSubjectID => urn:oasis:names:tc:SAML:attribute:subject-id | ||
+ | * samlPairwiseID => urn:oasis:names:tc:SAML:attribute:pairwise-id | ||
+ | |||
+ | Riferimenti: [[https://wiki.idem.garr.it/wiki/SAML-Subject-ID-Attribute]] | ||
Per tutti gli entityID non riferiti al dominio unipr.it occorre concordare il rilascio degli attributi, che saranno filtrati e rilasciati in maniera puntuale da parte del nostro IdP. | Per tutti gli entityID non riferiti al dominio unipr.it occorre concordare il rilascio degli attributi, che saranno filtrati e rilasciati in maniera puntuale da parte del nostro IdP. | ||
Linea 99: | Linea 108: | ||
===== Registrazione relying party (RP) ===== | ===== Registrazione relying party (RP) ===== | ||
- | Il gestore del RP deve fornire il Metadata in formato JSON: | + | Il gestore del RP deve fornire tutti i redirect URI che verranno registrati lato OP nel Metadata in formato JSON: |
- | ^ Nome chiave ^ Tipo del valore ^ Descrizione ^ | + | ^ Nome chiave ^ Tipo del valore ^ Descrizione | | |
- | | client_id | string | Identificatore OIDC client per l'RP | | + | | client_id | string | Identificatore OIDC client per l'RP | fornito da UNIPR | |
- | | response_types | array of strings | Tipologia risposte del client (obbligatorio id_token) | | + | | client_secret | string | Valore alfanumerico che funge da password | fornito da UNIPR | |
- | | scope | string | Lista degli scope che rilasciano i claim | | + | | response_types | array of strings | Tipologia risposte da parte dell'endpoint del OP | id_token (implicit flow) | |
- | | redirect_uris | array of strings | URL di redirezione per la response verso RP | | + | | scope | string | Lista degli scope che rilasciano i claim | openid email profile spid | |
+ | | redirect_uris | array of strings | URL di redirezione per la response verso RP | fornito da RP | | ||
Esempio: | Esempio: | ||
{ | { | ||
- | "redirect_uris":["httpq://www.esempio.it/secure/redirect_uri"], | + | "redirect_uris":["https://www.esempio.it/secure/redirect_uri"], |
"client_id":"lamiapp01", | "client_id":"lamiapp01", | ||
"client_secret":"stringaalfanumericasegreta", | "client_secret":"stringaalfanumericasegreta", | ||
Linea 120: | Linea 130: | ||
^ scope ^ claims - OP identifier ^ claims - oidc names ^ transcoder ^ | ^ scope ^ claims - OP identifier ^ claims - oidc names ^ transcoder ^ | ||
| openid | subject | sub | OIDCStringTranscoder | | | openid | subject | sub | OIDCStringTranscoder | | ||
- | | profile | displayName, sn, givenName, codiceFiscale | name, family_name. given_name, codicefiscale | OIDCStringTranscoder | | + | | profile | displayName, sn, givenName, codiceFiscale, matricola | name, family_name. given_name, codicefiscale, matricola | OIDCStringTranscoder | |
| spid | unipr_spid_email, spidName, spidFamilyName, spidCode, spidFiscalNumber, externalIDPLoA, externalIDPType, spid_shib_authnctx_class | unipr_spid_email, spidName, spidFamilyName, spidCode, spidFiscalNumber, externalIDPLoA, externalIDPType, spid_shib_authnctx_class | OIDCStringTranscoder | | | spid | unipr_spid_email, spidName, spidFamilyName, spidCode, spidFiscalNumber, externalIDPLoA, externalIDPType, spid_shib_authnctx_class | unipr_spid_email, spidName, spidFamilyName, spidCode, spidFiscalNumber, externalIDPLoA, externalIDPType, spid_shib_authnctx_class | OIDCStringTranscoder | | ||
| email | mail | email | OIDCStringTranscoder | | | email | mail | email | OIDCStringTranscoder | | ||
Linea 149: | Linea 159: | ||
["OIDC_CLAIM_codicefiscale"]=> | ["OIDC_CLAIM_codicefiscale"]=> | ||
string(16) "CPPRCR74P19Z112J" | string(16) "CPPRCR74P19Z112J" | ||
+ | ["OIDC_CLAIM_matricola"]=> | ||
+ | string(6) "12345678" | ||
["OIDC_CLAIM_eduPersonScopedAffiliation"]=> | ["OIDC_CLAIM_eduPersonScopedAffiliation"]=> | ||
string(44) "member@unipr.it staff@unipr.it alum@unipr.it" | string(44) "member@unipr.it staff@unipr.it alum@unipr.it" | ||
Linea 175: | Linea 187: | ||
| | ||
===== Flusso autorizzativo adottato dal nostro OP ===== | ===== Flusso autorizzativo adottato dal nostro OP ===== | ||
- | response_type => id_token | + | response_type => id_token (implicit flow) |
| | ||
In questa modalità è attivo solamente l'Authorization Endpoint che dopo l'autenticazione rilascerà l'ID Token comprensivo dei claim sottoscritti dagli scope. La durata dell'ID Token è 1h. | In questa modalità è attivo solamente l'Authorization Endpoint che dopo l'autenticazione rilascerà l'ID Token comprensivo dei claim sottoscritti dagli scope. La durata dell'ID Token è 1h. | ||
Linea 181: | Linea 193: | ||
{{:guide_pubbliche:howto:identity:response_type_id_token.png?600|}} | {{:guide_pubbliche:howto:identity:response_type_id_token.png?600|}} | ||
+ | |||
+ | ===== OIDC client di esempio sviluppato in PhP ===== | ||
+ | [[guide_pubbliche:howto:identity:oidc_client|Esempio di OIDC client scritto in PhP]] | ||
+ | |||
+ | |||
+ | https://wiki.asi.unipr.it/dokuwiki/doku.php?id=guide_pubbliche:howto:identity:oidc_client | ||
+ | |||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
Linea 189: | Linea 222: | ||
In vista della disattivazione del protocollo CAS, questo middleware semplifica notevolmente l'autenticazione presso il nostro Identity Provider, mettendo a disposizione dei service provider l'intera filiera di autenticazione 'a costo zero', senza cioè il bisogno da parte degli sviluppatori dei servizi web, di gestire il processo di autenticazione. | In vista della disattivazione del protocollo CAS, questo middleware semplifica notevolmente l'autenticazione presso il nostro Identity Provider, mettendo a disposizione dei service provider l'intera filiera di autenticazione 'a costo zero', senza cioè il bisogno da parte degli sviluppatori dei servizi web, di gestire il processo di autenticazione. | ||
</WRAP> | </WRAP> | ||
+ | |||
+ | ===== Modalità di richiesta ===== | ||
+ | Inviare una richiesta a helpdesk.informatico@unipr.it richiedendo che il proprio servizio web possa avvalersi del middleware di autenticazione OIDC mediato dal reverse proxy UNIPR.\\ | ||
+ | |||
+ | Nella richiesta è opportuno indicare se l'intera risorsa debba essere protetta da autenticazione ("/"), oppure solo una o più location specifiche ("/secure", "/percorso/specifico/").\\ | ||
+ | |||
+ | Infine indicare anche l'indirizzo IP del backend server (origin server) verso il quale il servizio di reverse proxy eseguirà l'upstream delle richieste.\\ | ||
+ | |||
+ | Si ricorda che il reverse proxy effettua TLS offloading, pertanto è obbligatorio accertarsi che il sito di backend non esegua alcun redirect verso https, altrimenti si genera un loop infinito a partire dalla prima richiesta. | ||
+ | |||
+ | Quando la richiesta verrà accolta e lavorata, il sito web sarà automaticamente sottoposto ad autenticazione e protetto da certificato TLS. | ||
===== Architettura ===== | ===== Architettura ===== | ||
- | {{:guide_pubbliche:howto:identity:architettura_reverse_oidc.png?600|}} | + | {{:guide_pubbliche:howto:identity:revproxyoidc.png?direct&800|}} |
- | ===== Attributi disponibli post autenticazione ===== | + | ===== Attributi disponibili post autenticazione ===== |
==== Autenticazione con credenziali di Ateneo ==== | ==== Autenticazione con credenziali di Ateneo ==== | ||
Linea 202: | Linea 247: | ||
[X-Remote-Sub] => TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU | [X-Remote-Sub] => TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU | ||
- | [X-Remote-Familyname] => CAPPONE | + | [X-Remote-Familyname] => ROSSI |
- | [X-Remote-Givenname] => Riccardo | + | [X-Remote-Givenname] => Mario |
- | [X-Remote-Externalidptype] => spid | + | [X-Remote-Externalidploa] => LoA2 |
- | [X-Remote-Externalidploa] => LoA3 | + | [X-Remote-Matricola] => 123987 |
- | [X-Remote-Codicefiscale] => CPPRCR74P19Z112J | + | [X-Remote-Codicefiscale] => RSSMAR74P19Z112J |
- | [X-Remote-Name] => Riccardo CAPPONE | + | [X-Remote-Name] => Mario ROSSI |
- | [X-Remote-Email] => riccardo.cappone@unipr.it | + | [X-Remote-Email] => mario.rossi@unipr.it |
</code> | </code> | ||
<code> | <code> | ||
Linea 216: | Linea 261: | ||
string(32) "TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU" | string(32) "TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU" | ||
["HTTP_X_REMOTE_FAMILYNAME"]=> | ["HTTP_X_REMOTE_FAMILYNAME"]=> | ||
- | string(7) "CAPPONE" | + | string(7) "ROSSI" |
["HTTP_X_REMOTE_GIVENNAME"]=> | ["HTTP_X_REMOTE_GIVENNAME"]=> | ||
- | string(8) "Riccardo" | + | string(8) "Mario" |
["HTTP_X_REMOTE_EXTERNALIDPLOA"]=> | ["HTTP_X_REMOTE_EXTERNALIDPLOA"]=> | ||
string(4) "LoA2" | string(4) "LoA2" | ||
+ | ["HTTP_X_REMOTE_MATRICOLA"]=> | ||
+ | string(6) "123987" | ||
["HTTP_X_REMOTE_CODICEFISCALE"]=> | ["HTTP_X_REMOTE_CODICEFISCALE"]=> | ||
- | string(16) "CPPRCR74P19Z112J" | + | string(16) "RSSMAR74P19Z112J" |
["HTTP_X_REMOTE_NAME"]=> | ["HTTP_X_REMOTE_NAME"]=> | ||
- | string(16) "Riccardo CAPPONE" | + | string(16) "Mario ROSSI" |
["HTTP_X_REMOTE_EMAIL"]=> | ["HTTP_X_REMOTE_EMAIL"]=> | ||
- | string(25) "riccardo.cappone@unipr.it" | + | string(25) "mario.rossi@unipr.it" |
</code> | </code> | ||
==== Autenticazione con SPID ==== | ==== Autenticazione con SPID ==== | ||
<code> | <code> | ||
+ | Headers disponibili | ||
[X-Remote-Sub] => TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU | [X-Remote-Sub] => TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU | ||
- | [X-Remote-Familyname] => CAPPONE | + | [X-Remote-Familyname] => ROSSI |
- | [X-Remote-Givenname] => Riccardo | + | [X-Remote-Givenname] => Mario |
[X-Remote-Externalidptype] => spid | [X-Remote-Externalidptype] => spid | ||
[X-Remote-Externalidploa] => LoA3 | [X-Remote-Externalidploa] => LoA3 | ||
- | [X-Remote-Codicefiscale] => CPPRCR74P19Z112J | + | [X-Remote-Codicefiscale] => RSSMAR74P19Z112J |
- | [X-Remote-Name] => Riccardo CAPPONE | + | [X-Remote-Name] => Mario ROSSI |
- | [X-Remote-Email] => riccardo.cappone@unipr.it | + | [X-Remote-Email] => mario.rossi@unipr.it |
</code> | </code> | ||
<code> | <code> | ||
+ | In php -> $_SERVER | ||
+ | |||
["HTTP_X_REMOTE_SUB"]=> | ["HTTP_X_REMOTE_SUB"]=> | ||
string(32) "TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU" | string(32) "TYFP4PMTLC2VKCSGOCS7QEEPN2I2F4OU" | ||
["HTTP_X_REMOTE_FAMILYNAME"]=> | ["HTTP_X_REMOTE_FAMILYNAME"]=> | ||
- | string(7) "CAPPONE" | + | string(7) "ROSSI" |
["HTTP_X_REMOTE_GIVENNAME"]=> | ["HTTP_X_REMOTE_GIVENNAME"]=> | ||
- | string(8) "Riccardo" | + | string(8) "Mario" |
["HTTP_X_REMOTE_EXTERNALIDPTYPE"]=> | ["HTTP_X_REMOTE_EXTERNALIDPTYPE"]=> | ||
string(4) "spid" | string(4) "spid" | ||
Linea 253: | Linea 303: | ||
string(4) "LoA3" | string(4) "LoA3" | ||
["HTTP_X_REMOTE_CODICEFISCALE"]=> | ["HTTP_X_REMOTE_CODICEFISCALE"]=> | ||
- | string(16) "CPPRCR74P19Z112J" | + | string(16) "RSSMAR74P19Z112J" |
["HTTP_X_REMOTE_NAME"]=> | ["HTTP_X_REMOTE_NAME"]=> | ||
- | string(16) "Riccardo CAPPONE" | + | string(16) "Mario ROSSI" |
["HTTP_X_REMOTE_EMAIL"]=> | ["HTTP_X_REMOTE_EMAIL"]=> | ||
- | string(25) "riccardo.cappone@unipr.it" | + | string(25) "mario.rossi@unipr.it" |
</code> | </code> |