SP con un centinaio di sotto servizi

Ho la necessità di creare un SP che permetta l’accesso SPID a tanti
(sono circa un centinaio) sotto-servizi. Tutti questi sottoservizi
sono PA autonome, riunite in federazione a una PA centrale.

Altro vincolo è che il SP si colleghi a un gateway aggregatore
(fedERa), il quale a sua volta girerà le comunicazioni SAML agli IdP.

Ho pensato che la soluzione migliore possa essere

  • un nodo Cluster SPID (gestito dalla PA centrale) che implementi un
    Request Handler verso il gateway aggregatore fedERa; nella richiesta
    SAML verrà specificato a quale sottoservizio fare riferimento

  • la PA centrale pubblica un file di metadati in cui sono esplicitati
    i 100+ sotto servizi (con gli indici e gli URL per ciascuno)

A questo punto sorge il problema che i sotto servizi sono tanti; sono
portali web già esistenti sviluppati con tecnologie diverse (php,
.Net, …).

Vedo due possibili soluzioni:

  1. la risposta (con il documento SAML Response) dal gateway arriva
    direttamente al sottoservizio.

    oppure

  2. il gw ritorna la SAML Response alla PA centrale (che aveva fatto
    la richiesta). La PA centrale si occupa di leggere gli attributi
    dell’autenticazione SAML e li gira al sottoservizio (non più in
    formato SAML), che li usa per autenticare l’utente.

Chiedo quindi:

  • La soluzione 1. (sulla carta più “pulita”, ma che comporta lo sforzo
    di sviluppo maggiore) è fattibile? In questo caso il componente
    AssertionConsumerService dovrebbe essere implementato in ogni
    singolo sotto servizio, è corretto? Ci sono esempi di
    implementazioni di AssertionConsumerService che ricevono risposta
    da gw federa in diverse tecnologie (php, .Net)?

  • La soluzione 2. (sicuramente di più rapida implementazione) è
    ammissibile?

Soluzione 2: userei, come fa qualche grossa PA, il campo RelayState per discernere i servizi a cui girare gli attributi. Rapido, efficente e facilmente gestibile.

Grazie per la dritta su RelayState.

Sempre riguardo alla soluzione 2., per quanto riguarda
l’autenticazione dei sottoservizi, ho bisogno di un servizio per
gestire l’autenticazione applicativa di ciascun sottoservizio (da
legare all’autenticazione SPID) nei confronti della PA centrale.

I sottoservizi sono PA locali, ciascuna con un proprio sito, un
proprio dominio (diverso da quello della PA centrale). Le tecnologie
di realizzazione dei siti possono essere le più disparate (php, .Net,
etc.)

Per questi motivi, l’ideale sarebbe avere un servizio per autenticare
i sottoservizi che abbia già degli SDK per linguaggi diversi.

Mi sapreste consigliare un tale servizio open per gestire l’autenticazione tra
sottoservizi e SPID?

Non so se ho capito bene la richiesta, ma forse Apereo CAS potrebbe svolgere la funzione richiesta. Ci sono client per Java e PHP che utilizzano il suo protocollo, ma supporta anche le autenticazioni SAML, OAuth ecc., oltre ad essere già usato per interfacciarsi con SPID.

Grazie per la risposta!

Ho costruito un Apereo CAS server di demo tramite un WAR overlay.

Sto provando a configurarlo affinché possa utilizzare un IDP esterno
(SPID, quindi SAML2). Nel mio esempio vorrei poterlo agganciare a una
istanza di test (testenv2).

Leggo che dovrebbe essere possibile tramite la Delegated Authentication:
https://apereo.github.io/cas/development/integration/Delegate-Authentication.html
https://apereo.github.io/cas/development/integration/Delegate-Authentication-SAML.html

Ho trovato anche questa guida:
https://apereo.github.io/2019/02/25/cas61-delegate-authn-saml2-idp/

La guida dice di “aggiungere la dipendenza richiesta
nell’overlay” in quello che sembra essere un file pom.xml. Nella
mia cartella dello WAR overlay però vedo solo un file di
configurazione per gradle (e quindi ho messo la implementation "org.apereo.cas:cas-server-support-pac4j-webflow:${project.'cas.version'}"
in build.gradle).

Dopodiché in cas.properties aggiungo le impostazioni citate
cas.authn.pac4j.saml[0]. etc. etc., ma dando il comando ./gradlew build e run ottengo un server che si interfaccia solo con il
database locale (come se il file cas.properties non fosse mai preso
in considerazione).

Non riesco quindi a capire come impostare i file di configurazione.

Qualcuno sa aiutarmi in questo?

Ciao Giacomo,
sei poi venuto a capo dell’integrazione di SAML2 nel CAS di Apereo?
Stiamo affrontando anche noi lo stesso problema e ci sarebbe utile capire se i problemi affrontati con pac4j siano risolubili.
Grazie mille!