Giter Site home page Giter Site logo

spid-dotnet-sdk's Introduction

spid-dot-net

Origini

Questo progetto tra origine dal progetto TPCWare SPID, frutto dell'hackaton day che si è tenuto in diverse sedi italiane il 7 e 8 ottobre 2017, realizzato da Nicolò Carandini e Antimo Musone. Maggiori informazioni possono essere trovate nel README del progetto originario.

Contenuto

Il repository contiene i seguenti progetti:

  • Libreria di autenticazione SPID (protocollo SAML2)
  • Applicazione dimostrativa ASP.NET
  • Applicazione dimostratima ASP.NET Core

Libreria di autenticazione

La libreria implementa tutte le funzionalità relative a SAML 2.0 e al protocollo di comunicazione tra SP e IdP tramite i seguenti servizi:

Creazione e configurazione dell'elenco degli IdP

La libreria offre servizi orientati alla creazione dell'elenco degli IdP (Identity Providers) a partire dall'URL del servizio di metadati forniti dall'AgID (Agenzia per l'Italia Digitale) secondo quanto previsto dalle norme tecniche SPID.

Tale elenco può essere ampliato e arricchito con ulteriori dettagli dall'applicazione che usa la libreria di autenticazione, tipicamente tramite file di configurazione.

Al momento le due applicazioni web dimostrative utilizzano il meccanismo di configurazione per la creazione dell'elenco degli IdP, ma è in corso di sviluppo la funzionalità di lettura dell'elenco IdP dal registro SPID fornito da AgID.

Richiesta Authn

  1. Creazione della richiesta di Authn in formato SAML 2.0
  2. Firma della richiesta con certificato X.509
  3. Analisi di validità e di stato della risposta dell'IdP relativa alla richiesta di Authn
  4. Estrazione dei dati dal formato XAML 2.0 ad una classe DTO tipizzata, contenente tutte le informazioni ricevute dall'IdP

Richiesta Logout

  1. Creazione della richiesta di Logout in formato SAML 2.0
  2. Firma della richiesta con certificato X.509
  3. Analisi di validità e di stato della risposta dell'IdP relativa alla richiesta di Logout
  4. Estrazione dei dati dal formato XAML 2.0 ad una classe DTO tipizzata, contenente tutte le informazioni ricevute dall'IdP

Helpers

La libreria contiene inoltre una serie di Helpers, utili alle applicazioni che la utilizzano:

  • Helper per il reperimento di certificati X509 dal contenitore sicuro (disponibile solo quando l'applicazione web gira su Windows, negli altri casi è possibile passare alla libreria direttamente il certificato stesso).

  • Helper per la crittografia delle richieste da inviare e per la verifica crittografica delle risposte ricevute.

  • Piccolo helper per i riperimento di dati comuni dall'istanza di classe DTO che contiene i dati della risposta di authenticazione (Fullname, Name, Family name, FiscalNumber ed Email)

Packaging

La libreria di autenticazione è stata scritta in modo da essere totalmente compatibile con .NET Standard 2.0 e con .NET 4.6.1, quindi è utilizzabile da quasiasi applicazione ASP.NET classic, ASP.NET Core (su Windows, Linux e OSX) e Xamarin (per App Android, iOS e UWP).

Per l'uso in produzione, si consiglia di utilizzare la libreria aggiungendo al progetto il pacchetto NuGet Italia.SPid.Authentication.

Web App

Per quanto riguarda le Web app (ASP.NET e ASP.NET Core 2.0) abbiamo cercato di scrivere un codice il più pulito e commentato possibile (ma si puo sempre migliorare...) in modo da farla diventare una reference app che documenti in modo pratico l'uso della libreria di autenticazione.

Per un tour visivo del funzionamento dell'app si rimanda alla documentazione

Sviluppi futuri

  • Modifica delle applicazioni web per la generazione automatica del bottone SPID (ad oggi il contenuto del pull down menu è codificato direttamente nel codice della pagina)-

  • Creazione di un componente middleware per ASP.NET Core 2.0 che incapsuli le funzionalità di autenticazione e logout della libreria in modo da rendere la libreria pluggabile e pienamente integrata nell'authorization flow delle applicazioni Web ASP.NET Core 2.0.

  • Creazione di un progetto Xamarin, con applicazione dimostrativa per Android e iOS.

  • Utilizzo del servizio locale di test hostato su Docker container Linux.

  • Test dell'applicazione Web ASP.NET Core 2.0 su Docker container Linux.

  • Scrittura della documentazione, al momento (davvero troppo) minimale.

Build and Test

Come prima cosa occorre creare il certificato digitale self-signed, tramite OpenSSL:

Una volta installato il tool, aprire da cmd.exe la cartella C:\OpenSSL-Win64\  e lanciare i seguenti comandi per generare il certificato mycerthackdevelopers.pfx:

set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg
 
openssl req -newkey rsa:2048 -nodes -keyout myspidprivatekey.pem -x509 -days 365 -out myspidcertificate.pem
 
openssl pkcs12 -export -in myspidcertificate.pem -inkey myspidprivatekey.pem  -out myspidcertificate.pfx

Ora occorre importare il certificato myspidcertificate.pfx in local machine/My e tramite lo strumento di gestione dei certificati della macchina (START + "Gestisci i certificati computer") esportare il file .CER in formato BASE64, facendo attenzione di non esportare la private key.

Se l'applicazione Web da errore "Unable to find private key in the X509Certificate" la causa più probabile è che il certificato non è più valido e deve essere reinstallato con la medesima procedura di cui sopra.

Il file così ottenuto contiene la chiave pubblica da utilizzare per la creazione del file XML dei metadati da inviare all'AgID (Agenzia per l'Italia Digitale) secondo le modalità di accreditamento descritte nella pagina Come diventare fornitore di servizi Pubblici o Privati con SPID.

Una volta accreditati con AgID, il suddetto file di metadati verrà inviato direttamenta da AgID ai vari IdP e si potrà testare il servizio e mandarlo in produzione.

Ad oggi, oltre al servizio locale di test, l'unico servizio esterno di test è fornito da Poste.it ed è a loro che va inviato il suddetto file di metadati per accreditarsi come SP e fare poi le prove di autenticazione e logout.

Nota: Poiché la libreria è di tipo .NET Standard 2.0 non è possibile aprire la soluzione con versioni di Visual Studio antecedenti a Visual Studio 2017.

spid-dotnet-sdk's People

Contributors

alranel avatar dependabot[bot] avatar marcoz-tsn avatar ncarandini avatar umbros avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spid-dotnet-sdk's Issues

Controlli non superati su Spid-saml-check

Buongiorno,
AGID mi ha risposto che la soluzione implementata non ha superato tutti i test, in particolare:

  • 3 Response Assertion non firmata
  • 4 Response Firma non valida
  • 60 Assertion Attributo InResponseTo di SubjectConfirmationData non specificato
  • 62 Assertion Attributo InResponseTo di SubjectConfirmationData diverso da ID request
  • 100 Assertion Firma diversa

A cosa è dovuto?

Sviluppo plugin per autenticazione SPID in .NET

Ci sono due strade per implementare un plugin per .NET:

  1. usare un middleware come Shibboleth
  2. implementare tutto direttamente nel plugin (self-contained)

Per i dettagli sulle due possibili soluzioni si vedano le considerazioni scritte nell'analoga issue per SPID-Django.

Lo scopo di un plugin SPID per .NET dovrebbe essere quello di:

  • facilitare l'integrazione del bottone di login nella posizione desiderata
  • fornire metodi semplici per leggere le informazioni sullo stato di autenticazione dell'utente e i relativi attributi

Per l'implementazione basata su Shibboleth (opzione 1): bisogna adattare uno Shibboleth a Windows partendo dal playbook Ansible già disponibile per Linux, e configurarlo su IIS.
Per l'implementazione self-contained (opzione 2): qual è la migliore libreria SAML?

Ambiente di test online SPID

Ciao stavo cercando di far funzionare il progetto con l'ambiente di test online di spid

https://idp.spid.gov.it:8080

Ho seguito tutte le procedure, ma dopo aver inserito le credenziali, non arrivo alla pagina di consenso ma ottengo un errore che riporta nella response saml quanto segue:

<saml2p:Response ID="_330b100a204eeaaeb9e0593fe62f7121" InResponseTo="_955534d6-e011-42e5-8e3e-bf75b36fc957" IssueInstant="2019-04-10T13:54:22.640Z" Version="2.0" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"><saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">https://idp.spid.gov.it</saml2:Issuer>saml2p:Status<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Requester"/>saml2p:StatusMessageSignature validation for Authentication Request failed.</saml2p:StatusMessage></saml2p:Status></saml2p:Response>

Qualche idea, qualcuno ha già provato con successo ad integrasi con l'ambiente di test online?

Grazie
Paolo

VerifySignature non corretto per Response in XmlSigningHelper.cs

Al momento la funzione VerifySignature() in XmlSigningHelper.cs verifica che ci sia almeno un elemento "ds:Signature" (oppure ns2:Signature oppure Signature).

Come indicato nelle regole tecniche (1.4.2 Response), e confermato dalla schermata di https://idptest.spid.gov.it/login fra le Opzioni avanzate, la firma dell'Assertion è obbligatoria, mentre la firma della Response è facoltativa. Nella Response ci possono quindi essere 2 "ds:Signature" e se si genera una Response con la firma solo sulla Response e non sull'Assertion il controllo di VerifySignature() (averne almeno una) viene superato, nonostante il vincolo di presenza della firma sull'Assertion non sia rispettato.

p.s. Sempre in base a queste regole tecniche trovo sbagliato che nel https://www.spid.gov.it/assets/download/SPID_QAD.pdf (noto ora che hanno rilasciato giusto ieri una nuova versione) il test numero 3.2 preveda un errore in caso di "Response non firmata".

Il progetto Docker complica l'uso della soluzione

Ho appena notato, caricando la soluzione in un PC che non ha Docker installato, che non è possibile effettuare la build.
Il workaround è di fare l'unload del progetto docker-compose:
image
ed escludere dal progetto Italia.Spid.AspNetCore.WebApp il file dockerfile.

Sto seriamente pensando di togliere il progetto docker-compose dalla soluzione, se qualcuno è contrario lasci un commento.

Procedura validazione metadata

Sto cercando di seguire la procedura per cercare di far funzionare questo progetto nella mia infrastruttura ai fini di un test.
Al momento cerco solo di comprendere il flusso delle operazioni da seguire e non dovrò mettere nulla in produzione.

Al momento ho generato un certificato self signed secondo la procedura e creato un file metadata.xml sulla base di quello inserito nel progetto ma modificandolo con la chiave pubblica del certificato che ho generato (vedi allegato)
TPCWare Metadata2.txt
.

Attualmente non mi sono chiari alcuni punti:

  1. Per far funzionare il progetto della WebApp occorre comunque mandare il metadata che ho generato ad AgID?
  2. Il metadata non contiene il tag , può essere comunque convalidato o è errato? Nel caso sia errato, come risolvere?
  3. Nel momento in cui il metadata venisse convalidato come deve essere utilizzato? Ossia, come farebbe la WebApp della soluzione a sfruttare proprio quel file?

pacchetto nuget inesistente

Per l'uso in produzione, si consiglia di utilizzare la libreria aggiungendo al progetto il pacchetto NuGet Italia.SPid.Authentication.

su nuget.org non è presente il package specificato.

come si usano i metadati?

il link in
La chiave così esportata è un mero file di testo che contiene la chiave pubblica da copiare nell'apposito campo della pagina web di creazione del file di metadati. non funziona.

Inoltre non è per nulla chiaro come Il file XML contenente i metadati creato dalla suddetta pagina va poi utilizzato per registrare la nostra applicazione Web

tentativi di accesso alla pagina del SP danno l'errore:
Formato richiesta non corretto

Ambiente di test SPID con caricamento Certificato X509 da file

per far funzionare il login SPID in locale, avendo noi l'esigenza di caricare il certificato da file, è stato necessario apportare le seguenti modifiche al codice nel file X509Helper.cs
ovvero è stata Creata una nuova funzione: GetCertificateFromFile(string path)

il codice è il seguente:

//Create new X509 store called teststore from the local certificate store.
X509Certificate2 certificate = new X509Certificate2();
//Create certificates from certificate files.
//You must put in a valid path to three certificates in the following constructors.
X509KeyStorageFlags flags = X509KeyStorageFlags.Exportable;
string path = ""C:/sviluppo/spid/spid-dotnet-sdk-master/Italia.Spid.AspNetClassic.WebApp/App_Data/myspidcertificate.pfx";
X509Certificate2 certificate1 = new X509Certificate2(path, "password", flags);
return certificate1;

la password deve essere quella con cui abbiamo creato il certificato da riga di comando attraverso le istruzioni openssl:

  1. openssl genrsa -out rootCA.key 1024
  2. openssl req -new -x509 -days 3650 -key rootCA.key -out rootCA.crt
  3. openssl pkcs12 -export -out mycertificate.pfx -inkey rootCA.key -in rootCA.crt

tuttavia per far funzionare la chiamata è stato necessario disabilitare il check
"Enable Signature Validation in Authentication Requests and Logout Requests" nella configurazione SAML del service provider.

logout: Issuer non presente nella LogoutRequest

Quando provo ad eseguire il logout mi viene restituito il seguente messaggio(utilizzando il progetto spid-testenv2 su Docker)
“Issuer non presente nella AuthnRequest”:
di seguito l'xml costruito durante la chiamata:

<?xml version="1.0" encoding="UTF-8"?> <saml2p:LogoutRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_f5466faa-b1c4-4337-a57b-45899770ada2" Version="2.0" IssueInstant="2020-12-15T09:50:49.176Z" Destination="WSO2" Reason="urn:oasis:names:tc:SAML:2.0:logout:user" NotOnOrAfter="2020-12-15T10:00:49.1768407Z"> <saml2:Issuer NameQualifier="https://localhost:44376" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://localhost:44376</saml2:Issuer> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> <Reference URI="#_f5466faa-b1c4-4337-a57b-45899770ada2"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> <DigestValue>yefJHLc48dUHvDqpfCi3mrq7tm1XKQqcDWpImcfktt4=</DigestValue> </Reference> </SignedInfo> <SignatureValue>FIRMA</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>CERTIFICATO</X509Certificate> </X509Data> </KeyInfo> </Signature> <saml2:NameID NameQualifier="https://localhost:44376" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">id_14ddd7f7756ae30149f4bc01790f7c4a83286e25</saml2:NameID> <saml2p:SessionIndex>id_10f006b7876450a05e7eedaa7dab5f6a63fb3b45</saml2p:SessionIndex> </saml2p:LogoutRequest>

Errore su IDP di test online

Buongiorno,
abbiamo implementato la soluzione .NET basata su WebAPP.
A seguito della compilazione e firma dei metadata, li abbiamo registrati sull'IDP di test di Agid (https://idptest.spid.gov.it/)

Provando ad invocare l'idp otteniamo il seguente errore
_ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

E' un problema noto?
C'e' qualcosa che possiamo controllare sul file metadata (è già in formato UTF8 e viene caricato senza problemi dal test).

Spid errore nella validazione dei test sulla response

Sto testando le response e riscontro problemi.Ad esempio la 03 assertion non firmata non da pagina di errore, ma va a buon fine.

Eseguendo sul mio progetto IdpAuthnResponse idpAuthnResponse = SamlHelper.GetAuthnResponse(collection["SAMLResponse"].ToString()); va tutto a buon fine, quando per quel test non dovrebbe funzionare.

Ho riscontrato lo stesso problema anche per altri test.

Typo in IdP/IdpAuthnResponse.cs

Alla linea 92
AssertionIssueInstant = AssertionIssueInstant;
va corretto in
AssertionIssueInstant = assertionIssueInstant;

Il campo "importo" deve essere decimal e non double

E' un errore usare float o double per import di valuta, visto che i valori vengono encodati

Da VerificaVoucher.wsdl:

<xsd:element maxOccurs="1" minOccurs="1" name="importo" type="xsd:double"/>

I valori monetari vanno messi dentro decimal che e' encodato in ...decimale e non ha problemi di approssimazione.

Info dll

Salve,
sono alle prime armi con .net;

ho downlodato la libreria e la stavo testando ma ottengo una marea di errori, come posso procedere per verificare di avere fatto tutto correttamente?

Ovviamente sto eseguendo in VB.net 2017 come da voi indicato.

Grazie

spid-saml-check

Ciao,
ho scaricato e installato l'applicazione di test sdk .NET MVC (non .NET Core). Ho scaricato con Docker l'ambiente di test, configurato sp_metadata.xml e config.yaml e tutto funziona correttamente.
Ho scaricato spid-saml-check e avviato su Docker.
Quali sono le indicazioni per integrarlo?
Ho creato un file metadata.xml e compilato con i dati presi da saml-check (certificato, url, entityId).
Ora in spid-saml-check, sezione download, dovrei puntare a tale file ma non viene rilevato. Cosa sbaglio?

Chacksignature fatto con la key presente nella risposta

nella verifica della signature della response

return signedXml.CheckSignature();

viene usato l'overload della chiamata che non passa la chiave pubblica del firmatario, ma usa quella nel nodo KeyInfo.

E' abbastanza sicuro? non sarebbe più corretto utilizzare la chiave pubblica estratta dal metadata dell'IdP?

cfr (https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.signedxml?view=dotnet-plat-ext-6.0#security-considerations-about-the-keyinfo-element)

Pacchetto NUGET

Si parla di pacchetto nuget per net core 2.2, ma su nuget non c'è nulla. Alla fine è stato fatto?

chiave non utilizzabile nello stato specificato

Ciao a tutti,
Dopo aver effettuato la creazione del certificato e la sua importazione tramite MMC, durante l'esecuzione (in debug) mi appare il seguente errore: chiave non utilizzabile nello stato specificato.
Qualcuno sa dirmi a cosa è dovuto ?

Grazie

Errore da sistema di test

Ho registrato il mio service provider in localhost su https://idp.spid.gov.it/admin/databasesprecord/
ho importato il progetto "as is" come da folder (non trovando il package nuget) ed ho sviluppato un po' di stub di test su Razor Page.

Il codice che esegue la post verso il server di test di poste funziona ma la post ritorna:

Errore:
Formato richiesta non corretto - Contattare il gestore del servizio

E' per caso cambiato qualcosa nel formato delle richieste?

Problema su logout

Buongiorno a tutti,
segnalo che il sistema - una volta effettuata la login con un IdP, nel caso particolare di livello SPID maggiore di 1 (quindi senza sessione), va in errore in quanto manca il controllo legato al fatto di NON dover inviare la richiesta di logout.

In particolare, nel file SamlHandler.cs, riga 404 e quindi 455 - il valore di authnStatementSessionIndex è pari a "" (essendo senza sessione) - quindi la response dall'IdP arriva vuota andando in errore.

[ERRORI] Applicazione dimostrativa ASP.NET

Salve,
non so se sia questa la sezione giusta.

A me la app non va, ottengo una marea di errori.

Sto compilando con vb.net 2017 come richiesto.

Sono alle prime armi con .net; devo configurare qualcosa nel progetto per poterlo eseguire? Dove sbaglio?

Errore nel firmare l'XML

Ho un problema con l'esecuzione del progetto di test, ho creato il certificato come descritto nel Readme per al momento dell'esecuzione mi esce il seguente errore:

Errore nella preparazione della richiesta di autenticazione da inviare al provider.
Chiave non utilizzabile nello stato specificato.

Debuggando, l'errore si presente alla chiamata di:

var rsaKeyString = privateKey.ToXmlString(true);

del file

XmlSigningHelper.cs

credo sia un problema di certificato, consigli?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.