2015-01-05 5 views
5

Ich habe das Spring-SAML-Beispiel (siehe Abschnitt 4.2 in this guide) genommen, das mit der Open-Source-Anmeldeseite SSO funktioniert und versucht, Unterstützung für die Verwendung von WSO2 Identity Server hinzuzufügen ein zusätzlicher IDP-Dienst. Dazu änderte ich das Spring-SAML-Beispielprojekt, indem ich eine Metadaten-XML-Datei für IS hinzufügte und der securityContext.xml einen Eintrag für die IS-Metadaten hinzufügte.Spring SAML-Integration mit WSO2-Identitätsserver, SAML-Nachrichten-ID nicht erkannt

Beim Ausführen der Spring-Anwendung habe ich nun die Möglichkeit, mich mit IS einzuloggen, und ich kann mich erfolgreich in WSO2 einloggen, wenn ich dorthin weitergeleitet werde. Die Spring-Anwendung löst jedoch eine Ausnahme für die IS SAML-Antwort aus, da sie nicht mit InResponseToField übereinstimmt.

Aus dem Debuggen der Anwendung wird angezeigt, dass die Antwortnachricht nicht als zu derselben Sitzung gehörend wie die Anforderungsnachricht erkannt wird. Ich sage, dass aus diesen 2 Log-Meldungen, 1. protokolliert, wenn die AuthRequest Senden und das zweite ist, wenn die Antwort empfangen wird:

2015-01-05 09:53:20,867 line="org.springframework.security.saml.storage.HttpSessionStorage.storeMessage(HttpSessionStorage.java:93)" thread="http-nio-8080-exec-1" class="org.springframework.security.saml.storage.HttpSessionStorage" Storing message ae2dab0fb8b0g8e49971b91a73e91i to session 26D3B7D9E33F26A7A5092BF6909B9D13 
... 
2015-01-05 09:54:10,731 line="org.springframework.security.saml.storage.HttpSessionStorage.retrieveMessage(HttpSessionStorage.java:117)" thread="http-nio-8080-exec-4" class="org.springframework.security.saml.storage.HttpSessionStorage" Message ae2dab0fb8b0g8e49971b91a73e91i not found in session BBF256F284F55D774E6997600E9B3388 

Die IS SAML-Antwort ist:

<?xml version="1.0" encoding="UTF-8"?><saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://localhost:8080/saml/SSO" ID="adlbklpnldoanfphalcaahhacooinnldcejjjioe" InResponseTo="ae2dab0fb8b0g8e49971b91a73e91i" IssueInstant="2015-01-05T09:53:38.063Z" Version="2.0"> 
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">localhost</saml2:Issuer> 
    <saml2p:Status> 
     <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> 
    </saml2p:Status> 
    <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="ebhfkdhlgbhclcklefjigfddoikklhjlanlbolel" IssueInstant="2015-01-05T09:53:38.065Z" Version="2.0"> 
     <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">localhost</saml2:Issuer> 
     <saml2:Subject> 
     <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">smit005</saml2:NameID> 
    <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> 
     <saml2:SubjectConfirmationData InResponseTo="ae2dab0fb8b0g8e49971b91a73e91i" NotOnOrAfter="2015-01-05T09:58:38.063Z" Recipient="http://localhost:8080/saml/SSO"/> 
    </saml2:SubjectConfirmation> 
    </saml2:Subject> 
    <saml2:Conditions NotBefore="2015-01-05T09:53:38.065Z" NotOnOrAfter="2015-01-05T09:58:38.063Z"> 
    <saml2:AudienceRestriction> 
     <saml2:Audience>com:vdenotaris:spring:sp</saml2:Audience> 
    </saml2:AudienceRestriction> 
    </saml2:Conditions> 
    <saml2:AuthnStatement AuthnInstant="2015-01-05T09:53:38.068Z" SessionIndex="406d4530-6fcf-4edf-b876-a68de4b4ea79"> 
    <saml2:AuthnContext> 
      <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef> 
    </saml2:AuthnContext> 
    </saml2:AuthnStatement> 
    <saml2:AttributeStatement/> 
    </saml2:Assertion> 
</saml2p:Response> 

Als Referenz Ich messe die Metadaten-XML-Datei, die ich für WSO2 IS hinzugefügt habe (ich musste ihr eine Entitäts-ID von "localhost" geben, da WSO2 IS darauf besteht, dass sie zurückgibt (standardmäßig wird der Hostname verwendet)).

<?xml version="1.0" encoding="UTF-8"?> 
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" 
        entityID="localhost" 
        validUntil="2023-09-23T06:57:15.396Z"> 
    <md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" > 
    <md:KeyDescriptor use="signing"> 
     <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
      <ds:X509Data> 
       <ds:X509Certificate>MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE 
        CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv 
        Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw 
        CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE 
        AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou 
        sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 
        HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID 
        AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i 
        QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR 
        O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=</ds:X509Certificate> 
       </ds:X509Data> 
      </ds:KeyInfo> 
     </md:KeyDescriptor> 
     <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://localhost:9443/samlsso" ResponseLocation="https://localhost:9443/samlsso"/> 
     <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://localhost:9443/samlsso"/> 
     <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://localhost:9443/samlsso"/> 
     <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat> 
     <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat> 
     <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat> 
     <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</NameIDFormat> 
    </md:IDPSSODescriptor> 
</md:EntityDescriptor> 

Da bat ich um ein Protokoll der Browser HTTP-Nachrichten auf dropbox gespeichert haben.

+0

Können Sie beim ersten Anmeldevorgang Dump von HTTP-Nachrichten in Ihren Browser einfügen? –

+0

Hallo Vladimir, ich habe einen Link zu einem Protokoll der Browsernachrichten hinzugefügt. – user1232555

Antwort

5

Sowohl Spring SAML als auch Ihr IDP WSO2-Server werden in derselben Domäne bereitgestellt - localhost. Dies ist, was passiert:

  • Frühling SAML erstellt eine HTTP-Sitzung (JSESSIONID-82F3ECD1A1E4F9B7DB0134F3129267A5) und initialisiert Single Sign-On
  • WSO2 akzeptiert die Anforderung und authentifiziert den Benutzer, sondern erstellt eine eigene Sitzung (JSESSIONID - C34B21931C53080487B5B9BA6EB490D2) und leitet Spring SAML Benutzer zurück
  • Behälter läuft Frühling SAML das Cookie mit JSESSIONID empfängt (C34B21931C53080487B5B9BA6EB490D2), aber da es nicht solche Sitzung erkennt erstellt es eine neue (E712A8422009613F6FD3901327690726)
  • Frühling SAML versucht empfangenen SAML-Nachricht zu überprüfen, basierend auf der ursprünglichen Anfrage, aber es kann nicht gefunden werden, weil die ursprüngliche Sitzung jetzt
  • weg

Der einfachste Weg, dies zu beheben, ist Session-Cookie Namen für Frühling SAML zu ändern oder WSO2. Sie könnten Ihre Anwendungen auch auf verschiedenen Domänen bereitstellen (z. B. indem Sie Ihrem localhost in der hosts-Datei einen Alias ​​zuweisen - /etc/hosts oder %systemroot%\system32\drivers\etc\hosts)

+0

Das war in der Tat das Problem, am Ende habe ich wso2 eingerichtet, um in einer VM zu laufen. Dies war einfacher als die Verwendung einer anderen Domäne. – user1232555

+0

@ vladimír-schäfer, wie können wir den Session-Cookie-Namen für Spring SAML ändern? –

+0

Als Teil von Spring Security - siehe hier http: // stackoverflow.com/questions/29964921/custom-cookie-name-wenn-benutze-feder-session –