Web SSO AuthnRequest štruktúra

Ahojte, snažím sa rozbehať sso na jave (kniznica opensaml2) a mám problém s vyskladaním správneho počiatočného authNRequestu. Metadáta s public key mám registrované u idp, a používam najnovšie metadáta idp z októbra.

request posielam ako post na https://auth.vyvoj.upvs.globaltel.sk/oamfed/idp/samlv20, content-type x-www-form-urlencoded, a cely obsah je v base 64 + inflate + url encoded. Ako som sa dozvedel, na dev by mal fungovat iba http-post binding, a RequestedAuthnContext Comparison musi byt nastaveny na “exact”. Neviem co by mohlo byt zle este ale predpokladam ze nieco v xml ktore odosielam. Vdaka dopredu za pomoc

<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">http://test.eranet.biz/upvs</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#_e1599d99960e7ac3b69e09e533c22da26e3ad499f6bb8e5cff757471497f310e">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>uQ8VE1QK0E2OBP00SwTiopcP4HE=</ds:DigestValue></ds:Reference></ds:SignedInfo>
<ds:SignatureValue>Nu1+y+C...//skratene pre prehladnost//...</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIID...//skratene pre prehladnost//...
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:RequestedAuthnContext Comparison="exact">
<saml:AuthnContextClassRef 
<xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
</saml:AuthnContextClassRef></saml2p:RequestedAuthnContext>
</saml2p:AuthnRequest>

Prikladam korektne skonstruovany request, placeholdre vsak treba nahradit - ${assertion_consumer_URL} s URL endpointu assertion consumer-a a ${metadata_entityID} s identifikatorom service provider-a vramci metadat.
Pre doplnenie, request treba poslat ako GET request a nie POST, vid.

http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html#5.1.2.SP-Initiated%20SSO%3A%20%20Redirect%2FPOST%20Bindings|outline

<saml2p:AuthnRequest AssertionConsumerServiceURL="${assertion_consumer_URL}"
                     Destination="https://auth.vyvoj.upvs.globaltel.sk/oamfed/idp/samlv20"
                     ForceAuthn="false"
                     ID="_19f8d5f6-7f40-4d6c-93e6-bbc56366ce32"
                     IsPassive="false"
                     IssueInstant="2017-11-06T08:41:42.096Z"
                     ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                     Version="2.0"
                     xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
>
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">${metadata_entityID}</saml2:Issuer>
    <saml2p:NameIDPolicy AllowCreate="true"
                         Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
                         SPNameQualifier="${metadata_entityID}"
    />
    <saml2p:RequestedAuthnContext Comparison="exact">
        <saml2:AuthnContextClassRef xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
            urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
        </saml2:AuthnContextClassRef>
        <saml2:AuthnContextClassRef xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
            urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI
        </saml2:AuthnContextClassRef>
    </saml2p:RequestedAuthnContext>
</saml2p:AuthnRequest>
`
3 Likes

Vďaka, vyhodil som signature, certifikát a pridal NameIDPolicy, takže už to mám v rovnakom formáte ale stále dostávam “System error”.

Pôvodne som používal signature podľa https://www.samltool.com/generic_sso_req.php. (AuthNRequest with embedded signature (HTTP-POST binding))

Nie je potrebné tento request podpísať pred odoslaním?

Ono to samozrejme podpisane je, ale podpis je sucastou GET query parametrov.

Zrejme ten HTTP request ako taky nekonstruujes dobre. Priloz sem log z HTTP requestu a bude to jasnejsie.

ano problém bol ten že som ich neposielal ako query parametre. Doplnil som to, takže teraz vyzerajú pred URL encodovanim takto:

SAMLRequest=xZRPj9MwEMW/SuR7869pk7XaSqUVom…4j/DYX6M11o1ajcaSf/l8+0dZ/QI=
SigAlg=http://www.w3.org/2000/09/xmldsig#rsa-sha1
Signature=Zok42CoMUTHDdvVvioAdzGpTXCh0ZP…zS090wimRTRGcGy8CAgBp6j1nhQ==

Ale stále to nefunguje, a asi to vyriešim už iba s globaltelom kedže samotný request by mal byť už správny

Tu najdes “referencnu” implementaciu, mozes vyskusat sam. Je to zalozene na CXF, ale interne to pouziva OpenSAML, avsak vo verzii 3.x.

3 Likes