italia / spid-aspnetcore

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

Funzionalità per non consentire il challenge in determinate circostanze #65

Closed PiemP closed 1 year ago

PiemP commented 1 year ago

Buongiorno,

premetto che non ci capisco molto. Sto cercando di integrare il client SAML dentro un CMS .net core come sistema di "autenticazione esterno". Al momento sto avendo un problema perché, quando cerco di accedere ad un area che richiede un utente autenticato senza avere una sessione valida, viene avviato un processo di verifica dell'autenticazione che mi genera questo problema:

An unhandled exception has occurred while executing the request. System.ArgumentNullException: Value cannot be null. (Parameter 'Il parametro identityProvider non può essere null')
   at SPID.AspNetCore.Authentication.Helpers.BusinessValidation.Argument[T](T input, String error)
   at SPID.AspNetCore.Authentication.Saml.SamlHandler.GetAuthnRequest(String requestId, String entityId, String assertionConsumerServiceURL, Nullable`1 assertionConsumerServiceIndex, UInt16 attributeConsumingServiceIndex, X509Certificate2 certificate, Int32 securityLevel, RequestMethod requestMethod, IdentityProvider identityProvider)
   at SPID.AspNetCore.Authentication.SpidHandler.HandleChallengeAsync(AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.ChallengeAsync(AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.<>c__DisplayClass0_0.<<HandleAsync>g__Handle|0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
...

Ho cercato di capire se potessi evitare in qualche modo l'avvio di questa richiesta di autenticazione: ma non ci ho capito molto.

Ho cercato di dare un occhiata al codice del client SPID per capire se fosse possibile inserirsi in qualche modo tramite qualche customizzazione prima dell'esecuzione del codice che causa l'errore: ma la cosa non sembra fattibile al momento.

Mi piacerebbe fare un paio di aggiunte al codice. Una che va nella direzione di consentire un'ulteriore meccanismo di customizzazione per stabilire se è consentito l'avvio di una richiesta di autenticazione tramite il client SPID. Grosso modo vorrei aggiungere un servizio che integra il controllo fatto nello SpidHandler. Una cosa tipo questa:

/// <summary>
/// Decides whether this handler should handle request based on request path. If it's true, HandleRequestAsync method is invoked.
/// </summary>
/// <returns>value indicating whether the request should be handled or not</returns>
public override async Task<bool> ShouldHandleRequestAsync()
{
            var result = (await base.ShouldHandleRequestAsync()) && _customService.CanIHandle();
            if (!result)
            {
                result = Options.RemoteSignOutPath == Request.Path;
            }
            return result;
}

Nel mio caso CanIHandle verifica che sia stato fornito un parametro idpName nella richiesta (in caso di logout il codice dovrebbe comportarsi correttamente).

La seconda aggiunta è un altro servizio per il recupero del parametro idpName di modo che possa essere recuperato anche da richieste in POST e non solo da richieste GET.

Grazie.

PiemP commented 1 year ago

La problematica principale di questa issue era conseguenza di una cattiva implementazione da parte mia dell'integrazione di questo codice con il CMS che sto usando. Non mi dispiacerebbe comunque implementare un metodo per recuperare l'IdP altri tipi di richieste oltre a GET.