Strumenti Utente

Strumenti Sito


guide_pubbliche:howto:identity:shibbolethsp_config

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

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>​