italia / spid-aspnetcore

AspNetCore Remote Authenticator for SPID
https://github.com/danielegiallonardo/spid-aspnetcore
MIT License
40 stars 11 forks source link

ProviderName vuoto #63

Closed claudiopizzillo closed 1 year ago

claudiopizzillo commented 1 year ago

Salve,

nei custom SPID events sto ceracndo di loggare il nome del ProviderName come da codice

`
private static XmlSerializer loginRequestSerializer = new(typeof(AuthnRequestType)); private static XmlSerializer logoutRequestSerializer = new(typeof(LogoutRequestType)); public override async Task RedirectToIdentityProvider(RedirectContext context) { using MemoryStream stream = new(); string AuthnReq_ID = string.Empty; string AuthnReq_IssueInstant = string.Empty; string Name = string.Empty;

        if (context.SignedProtocolMessage is AuthnRequestType loginRequest)
        {
            AuthnReq_ID = loginRequest.ID;
            AuthnReq_IssueInstant = loginRequest.IssueInstant;
            Name = loginRequest.ProviderName;
            loginRequestSerializer.Serialize(stream, loginRequest);
        }
        else if (context.SignedProtocolMessage is LogoutRequestType logoutRequest)
        {
            AuthnReq_ID = logoutRequest.ID;
            AuthnReq_IssueInstant = logoutRequest.IssueInstant;
            logoutRequestSerializer.Serialize(stream, logoutRequest);
        }

        stream.Position = 0;
        log.LogInformation($"Request - AuthnReq_ID: {AuthnReq_ID},  AuthnReq_IssueInstant: {AuthnReq_IssueInstant}, Name: {Name},");
        await File.WriteAllBytesAsync($"./Xml/{AuthnReq_ID}_request.xml", stream.ToArray());
        await base.RedirectToIdentityProvider(context);
    }

`

Ma risulta sempre vuoto.

Non dovrebbe essere popolato?

Grazie per la ottima libreria, mi ha permsesso di migrare da una vecchia implementazione .NET classica in maniera veloce.

danielegiallonardo commented 1 year ago

Salve Claudio, come da questa issue https://github.com/italia/spid-testenv2/issues/341 l'attributo ProviderName non è ammesso nel messaggio di Request. Ad ogni modo cosa ti interessa avere all'interno degli SpidEvents come informazione? Il nome dell'identityProvider (e.g. Poste, Tim, ecc...) o del service provider (la tua webapp in fase di integrazione)? Nel primo caso purtroppo a quel livello di Spid Events non è presente questa informazione, nel secondo caso invece puoi fare riferimento all'EntityId come identificativo univoco del SP.

danielegiallonardo commented 1 year ago

Inoltre ti invito, se stai usando la libreria dalla versione 2.0.0 in poi, ad utilizzare, per scopi di Logging l'apposito LogHandler come specificato sul README

claudiopizzillo commented 1 year ago

Salve e grazie per la pronta risposta.

Vovelo leggere il nome dell'identityProvider (mantenendo lo stesso schema di logging della precedente webapp) .

Non ho provato il LogHandler (anche se ho implementato la classe come da esempio per futuri usi): hai un esempio per l'estrazione dei dati dalle request e le response? Grazie.

danielegiallonardo commented 1 year ago

Purtroppo il nome dell'IdP non è disponibile a quel livello. Le informazioni possono essere estratte dalle request e dalle response serializzandole con XmlSerializer all'interno dei tipi corrispondenti:

claudiopizzillo commented 1 year ago

Come posso discernere se la request è una AuthnRequestType o una LogoutRequestType? Da SpidEvent è fattibile ma qui ho la SAMLrequest grezza, Url, Headers ecc...

danielegiallonardo commented 1 year ago

I metodi del LogHandler sono pensati per effettuare esclusivamente persistenza delle request grezze. Se occorre fare inspection degli oggetti si possono continuare ad usare gli SpidEvents