Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problema su logout #21

Closed
santesem-links opened this issue Sep 29, 2021 · 22 comments
Closed

Problema su logout #21

santesem-links opened this issue Sep 29, 2021 · 22 comments
Assignees

Comments

@santesem-links
Copy link

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.

@danielegiallonardo danielegiallonardo self-assigned this Sep 29, 2021
@danielegiallonardo
Copy link
Collaborator

danielegiallonardo commented Sep 29, 2021

Salve,
ho appena provato una login/logout su livello 2 in ambiente di produzione con IdP Poste, ed ho concluso il giro con successo (pur constatando che il valore di SessionIndex al livello 2 è effettivamente vuoto). Vale a dire che la response di logout da Poste, nonostante la mancanza del valore SessionIndex, non è vuota.
Può allegare le request/response di login/logout (ovviamente "redacted" dei dati sensibili) con le quali riscontra l'errore e segnalare su quale ambiente/IdP lo riscontra?

@santesem-links
Copy link
Author

Salve e grazie per la celere risposta.
Utilizzo in locale il validator.

Effettuo la login con il validator - ma quando effettuo la logout request (che riporto sotto) - nello SpidHandler.cs, riga 248
var validSignOut = ValidateSignOutResponse(message, logoutRequest);
ottengo un NullReferenceException in quanto la response ottenuta è null.

Questa è la LogoutRequest (logoutRequest.SerializeToXmlDoc() da debugger)
"Document" Attributes: null BaseURI: "" ChildNodes: {System.Xml.XmlChildNodes} DocumentElement: "Element, Name=\"LogoutRequest\"" DocumentType: null FirstChild: "Element, Name=\"LogoutRequest\"" HasChildNodes: true Implementation: {System.Xml.XmlImplementation} InnerText: "https://localhost:44369\n _137768ed-c05d-4312-a830-b46ce5eee1a4\n " InnerXml: "<LogoutRequest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ID=\"_081ce35a-f114-4e9d-be1d-030950cc9e27\" Version=\"2.0\" IssueInstant=\"2021-09-29T16:08:53.181Z\" Destination=\"https://localhost:8080/samlsso\" Reason=\"urn:oasis:names:tc:SAML:2.0:logout:user\" NotOnOrAfter=\"2021-09-29T18:18:53.181Z\" xmlns=\"urn:oasis:names:tc:SAML:2.0:protocol\"><Issuer NameQualifier=\"https://localhost:44369\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:entity\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\">https://localhost:44369</Issuer><NameID NameQualifier=\"https://localhost:44369\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:transient\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\">\n _137768ed-c05d-4312-a830-b46ce5eee1a4\n </NameID><SessionIndex /></LogoutRequest>" IsReadOnly: false LastChild: "Element, Name=\"LogoutRequest\"" LocalName: "#document" Name: "#document" NameTable: {System.Xml.NameTable} NamespaceURI: "" NextSibling: null NodeType: Document OuterXml: "<LogoutRequest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ID=\"_081ce35a-f114-4e9d-be1d-030950cc9e27\" Version=\"2.0\" IssueInstant=\"2021-09-29T16:08:53.181Z\" Destination=\"https://localhost:8080/samlsso\" Reason=\"urn:oasis:names:tc:SAML:2.0:logout:user\" NotOnOrAfter=\"2021-09-29T18:18:53.181Z\" xmlns=\"urn:oasis:names:tc:SAML:2.0:protocol\"><Issuer NameQualifier=\"https://localhost:44369\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:entity\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\">https://localhost:44369</Issuer><NameID NameQualifier=\"https://localhost:44369\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:transient\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\">\n _137768ed-c05d-4312-a830-b46ce5eee1a4\n </NameID><SessionIndex /></LogoutRequest>" OwnerDocument: null ParentNode: null Prefix: "" PreserveWhitespace: true PreviousSibling: null PreviousText: null SchemaInfo: {System.Xml.Schema.XmlSchemaInfo} Schemas: {System.Xml.Schema.XmlSchemaSet} Value: null Results View: Expanding the Results View will enumerate the IEnumerable

@danielegiallonardo
Copy link
Collaborator

Aggiungo che, in assenza del parametro sessionIndex, l'IdP di poste ha restituito una response contenente questo statuscode (come da regole tecniche spid: https://docs.italia.it/italia/spid/spid-regole-tecniche/it/stabile/single-logout.html#gestione-delle-sessioni)

<saml2p:Status>
    <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Requester">
        <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:PartialLogout"/>
    </saml2p:StatusCode>
</saml2p:Status>

che la libreria interpreta correttamente, proseguendo il flusso di logout.
Probabilmente è il validator che non restituisce una risposta (neanche con statusCode PartialLogout) alla richiesta di logout priva del parametro sessionIndex.
Includo @peppelinux per ulteriore valutazione.

@dassocec
Copy link

Anch'io riscontro lo stesso comportamento segnalato sul logout

@santesem-links
Copy link
Author

il problema su Logout ho scoperto che è un problema noto - ed è dovuto al fatto che il sistema ignora la configurazione post e fa il redirect.

image

link anche --> italia/spid-saml-check#167

@danielegiallonardo
Copy link
Collaborator

Vale a dire che la SAMLResponse della Logout arriva in querystring?

@santesem-links
Copy link
Author

ahimè sì - quindi ignora la configurazione post ed effettua sempre il redirect

@danielegiallonardo
Copy link
Collaborator

Ok, facciamo così, faccio una PR su un branch contenente il fix, ti è possibile eventualmente condurre qualche test sul branch, dal momento che hai già le configurazioni di test e le request pronte?

@danielegiallonardo
Copy link
Collaborator

Inoltre, potresti incollarmi il valore che ricevi in Querystring, così valuto se deve essere effettuato il Deflate e l'UrlDecode? Grazie

@santesem-links
Copy link
Author

leggo

Un costrutto SAML codificato in formato Base64 e compresso con algoritmo DEFLATE. Come da specifica, il messaggio SAML non contiene la firma in formato XML Digital Signature esteso (come avviene in generale nel caso di binding HTTP-POST). Ciò a causa delle dimensioni eccessive che esso raggiungerebbe per essere veicolato in una query string. La specifica indica come modalità alternativa quella di specificare con parametri aggiuntivi l’algoritmo utilizzato per firmare (SigAlg) e la stringa con la codifica Base64 URL-encoded dei byte del messaggio SAML (Signature).

la response è:

?SAMLResponse=fVLBasJAEL0L%2FoPkvs1usonrokKpFARbaBUPvZRJstGFZDdkNtD%2BfZPUtNqKc5x5782bx8wRyqKSG3uwjXtVWFmDajIeTdr6KAuDsgcsvKY20gJqlAZKhdKlcnv%2FtJHBHZVVbZ1NbeH9I97mAaKqnbZmIK5XC%2B%2BdRlkITCgy4zwgPFaUiIBTopKcM8oCxngyEPaqxpa%2F8Fq5HxHERq0NOjCuHdCAEUYJZTsWyiiUdPo2IFcKnTbgeoWjcxVK3y9sCsXRopOch%2FHMR30wbTYEK515pw1mSGpnW8OzKAeW5BnhKRWEBzAlCcSCCMghCNIpRLHwlt%2FUeZeK7C3WJxddPdq6BHc7ra6jM5L3UKmM0%2B7T%2B5V4bscvDRQ616q%2Bdo6ggg42urqOmPtnDnv0mfFKbh24Bs9ULvoPNlOTPRSNun0K9mi5bdJUIXr%2BEI7%2FZ8l4NLQuH3T5BQ%3D%3D&RelayState=95fa1bfd-4c08-42a7-ba68-8afa22c7a568&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256&Signature=Dx%2BZ94nXVIGCFOO32QcnOHxBwiiAU%2Bg9PLM7otCR4kQEyndmSV6TjX5chMFfh9F5bohz9ZZuErNCGrzUB1aXAQXybi3WKKW0%2FIKKjr5GHI3hoVgEoP%2F8ifmDBewm%2F%2BD0iGFuujFWGV0f%2F7sCO%2BdYSXFSeSljXlC49JDsTFTC943pIdIgw7PtG6SJl92B2qUVcSe1BEZTTbyahW216mT4ejBnYAS5smtL9iEKu3o8JfEyMj7rUXBDuzpUO5Bz17ATQkXM2U%2BjIH89GIKTI5ZAaUoCvPNALPkwc40170OZTzKDR7XJsEsBXmMxYC%2FrN%2BMc6a2RRhkPWbxQo2pkEB9now%3D%3D

@danielegiallonardo
Copy link
Collaborator

Ho creato un branch "FixRedirectResponse", potresti verificare se su questo branch il bug sulla logout è risolto?

@santesem-links
Copy link
Author

image

@danielegiallonardo
Copy link
Collaborator

Ok, ho fixato e aggiornato la PR, puoi riprovare?

@santesem-links
Copy link
Author

verifysignature fallisce, l'xml forse è formattato differentemente rispetto al post.

@danielegiallonardo
Copy link
Collaborator

Ok, ho rivisto tutto il giro della verifica delle firme, ora dovrebbe andare

@santesem-links
Copy link
Author

image

@danielegiallonardo
Copy link
Collaborator

danielegiallonardo commented Oct 4, 2021

E' davvero strano, ho verificato io stesso il funzionamento della logout ed era tutto ok. Puoi incollare richiesta e risposta? Grazie

@santesem-links
Copy link
Author

in XmlHelpers.cs, linea 84 - la variabile xmlMetadata risulta null, e quando va nell'else (linea 100) va in eccezione.

signedXml.LoadXml((XmlElement)nodeList[0]);

image

Il dato di signedDocument è questo

<samlp:LogoutResponse xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_181e9a93-dff0-407b-98b5-0ef09204ec60" Version="2.0" IssueInstant="2021-10-05T07:37:46Z" Destination="https://localhost:44369/signout-spid" InResponseTo="_98f6f2b3-3e99-48f6-8574-c3a4c0181d3f">
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity" NameQualifier="https://localhost:8080">
        https://localhost:8080</saml:Issuer>
  
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
    </samlp:Status>

</samlp:LogoutResponse>

@danielegiallonardo
Copy link
Collaborator

Beh, questo significa però che il valore "OrganizationUrlMetadata" per l'identityProvider specificato in configurazione non è un URL valido. Se xmlMetadata è null significa che la libreria non è riuscita ad effettuare il download del metadata, che viene fatto a runtime per la verifica della firma. Potresti verificare questa cosa?

@danielegiallonardo
Copy link
Collaborator

Mi correggo, per il logout effettua una verifica della firma senza ricorrere al metadata, ma noto che nella response la firma non c'è, per questo la verifica fallisce. Mi chiedo se è un comportamento corretto.

@santesem-links
Copy link
Author

Sono sicuro che è un errore dell'IdP di test, cioè, io nella configurazione ho HTTP-POST - e loro mi rispondono con un HTTP-Redirect.

IMHO è un problema lato appunto di IdP (spid-saml-check).

@danielegiallonardo
Copy link
Collaborator

Sul repo di spid-saml-check ci sono diverse issue legate alla logout. In particolare la issue relativa al fatto che risponda in redirect ad una richiesta in POST, è riportata anche qui:
italia/spid-saml-check#159

Per quanto riguarda il problema sulla firma, ho aperto una issue:
italia/spid-saml-check#191

Chiudo questa issue, dal momento che il problema si verifica esclusivamente rispetto al validatore e non in ambiente di produzione/collaudo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants