2016-01-07 56 views
1

我是SAML的新手,並將其集成到Spring Web應用程序中。我開始遵循彈簧SAML快速入門指南在這裏找到: http://docs.spring.io/spring-security-saml/docs/1.0.0.RELEASE/reference/html/chapter-quick-start.htmlSpring SAML別名同時用於實體和SP

我得到了這個運行良好。然後,我想切換到目標IDP,該IDP已在運行,併成功爲公司內的其他SP服務。

在我securityContext.xml,我增加了以下內容元數據的bean:

<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate"> 
     <constructor-arg> 
      <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider"> 
       <constructor-arg> 
        <value type="java.io.File">classpath:security/MyEntityId_sp.xml</value> 
       </constructor-arg> 
       <property name="parserPool" ref="parserPool"/> 
      </bean> 
     </constructor-arg> 
     <constructor-arg> 
      <bean class="org.springframework.security.saml.metadata.ExtendedMetadata"> 
       <property name="local" value="true"/> 
       <property name="alias" value="myAlias"/> 
       <property name="securityProfile" value="metaiop"/> 
       <property name="sslSecurityProfile" value="pkix"/> 
       <property name="signingKey" value="apollo"/> 
       <property name="encryptionKey" value="apollo"/> 
       <property name="requireArtifactResolveSigned" value="false"/> 
       <property name="requireLogoutRequestSigned" value="false"/> 
       <property name="requireLogoutResponseSigned" value="false"/> 
       <property name="idpDiscoveryEnabled" value="false"/> 
      </bean> 
     </constructor-arg> 
    </bean> 

    <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider"> 
     <constructor-arg> 
      <value type="java.io.File">classpath:security/IDP-MetaData.xml</value> 
     </constructor-arg> 
     <property name="parserPool" ref="parserPool"/> 
    </bean> 

使用Firefox SAML示蹤劑,我可以看到互動做工精細,以及IDP重定向回我的應用程序( SP)使用有效的SAML XML數據包對用戶進行身份驗證。這並不奇怪,因爲這個IDP已經成功地被其他SP使用。 但是,重定向到「http://localhost:8080/saml-demo/saml/SSO/alias/myAlias」,從而引發以下錯誤給瀏覽器...

Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: Error determining metadata contracts 

與Java調試器挖成代碼遠一點,我找到了真正的代碼中的錯誤更深。當它看到SP和IDP的相同別名時,它由第913行的org.springframework.security.saml.metadata.MetadataManager引發。真正的錯誤是:

MetadataProviderException: Alias myAlias is used both for entity MyEntityId and MyEntityId 

超出了快速入門指南有這唯一的其他變化是對metadataGeneratorFilter:

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter"> 
    <constructor-arg> 
     <bean class="org.springframework.security.saml.metadata.MetadataGenerator"> 
      <property name="entityId" value="MyEntityId"/> 
      <property name="signMetadata" value="false"/> 
     </bean> 
    </constructor-arg> 
</bean> 

的IDP元數據文件包含...

<md:EntityDescriptor entityID="MyEntityId" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"> 
    <md:IDPSSODescriptor WantAuthnRequestsSigned="0" 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>xxxxxx</ds:X509Certificate> 
     </ds:X509Data> 
     </ds:KeyInfo> 
    </md:KeyDescriptor> 
    <md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" index="0" isDefault="1" /> 
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.myidp.com/sa1234/" /> 
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://auth.myidp.com/sa1234/" /> 
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" /> 
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.myidp.com/sa1234/" /> 
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://auth.myidp.com/sa1234/" /> 
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" /> 
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.myidp.com/sa1234/" /> 
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://auth.myidp.com/sa1234/" /> 
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" /> 
    </md:IDPSSODescriptor> 
    <md:AttributeAuthorityDescriptor 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>xxxxxx</ds:X509Certificate> 
     </ds:X509Data> 
     </ds:KeyInfo> 
    </md:KeyDescriptor> 
    <md:AttributeService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" /> 
    </md:AttributeAuthorityDescriptor> 
</md:EntityDescriptor> 

這裏是MyEntityId_sp.xml的內容:

<?xml version="1.0" encoding="UTF-8"?> 
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" 
    ID="MyEntityId" entityID="MyEntityId"> 
    <md:SPSSODescriptor AuthnRequestsSigned="true" 
     WantAssertionsSigned="false" 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>xxx</ds:X509Certificate> 
       </ds:X509Data> 
      </ds:KeyInfo> 
     </md:KeyDescriptor> 
     <md:KeyDescriptor use="encryption"> 
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
       <ds:X509Data> 
        <ds:X509Certificate>xxx</ds:X509Certificate> 
       </ds:X509Data> 
      </ds:KeyInfo> 
     </md:KeyDescriptor> 
     <md:SingleLogoutService 
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
      Location="http://localhost:8080/saml-demo/saml/SingleLogout/alias/myAlias" /> 
     <md:SingleLogoutService 
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
      Location="http://localhost:8080/saml-demo/saml/SingleLogout/alias/myAlias" /> 
     <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress 
     </md:NameIDFormat> 
     <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient 
     </md:NameIDFormat> 
     <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent 
     </md:NameIDFormat> 
     <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified 
     </md:NameIDFormat> 
     <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName 
     </md:NameIDFormat> 
     <md:AssertionConsumerService 
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" 
      Location="http://localhost:8080/saml-demo/saml/SSO/alias/myAlias" 
      index="0" isDefault="true" /> 
     <md:AssertionConsumerService 
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8080/saml-demo/saml/SSO/alias/myAlias" 
      index="1" /> 
    </md:SPSSODescriptor> 
</md:EntityDescriptor> 
+1

您不能有兩個具有相同標識符的實體。不確定Spring是否支持虛擬標識符的概念,如某些商業產品,這就是爲什麼這是一個評論,而不是回答。 –

+0

感謝您的迴應安德魯。我將SP的元數據文件中的EntityID更改爲其他內容。所以現在IDP有一個EntityID,而SP有一個不同的。當我這樣做時,我得到這個錯誤:「WebSSOProfileConsumerImpl - 我們的實體不是斷言的目標受衆」。這就是爲什麼我配置了兩個相同的EntityID,我認爲他們必須是相同的。 – rwblackburn

+0

查看firefox中的SAML示蹤器,來自IDP的最終SAML聲明包含: MyEntityId rwblackburn

回答

2

我能夠找出問題。

IDP的受衆限制使用與IDP本身的EntityID相同的ID和廣告。我可以在IDP元數據文件中看到這一點:

<md:EntityDescriptor entityID="MyEntityId" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"> 

然後使用Firefox SAML微量添加上我可以看到從IDP最後的性反應包含:

<saml:AudienceRestriction> <saml:Audience>MyEntityId</saml:Audience> </saml:AudienceRestriction> 

顯然「MyEntityID」不什麼是字面上使用,它是這個應用程序的關鍵字在文件的上下文中有意義。但是,這意味着我需要爲我的SP實體提供與此AudienceRestriction相同的ID,否則我會收到錯誤消息。然而,正如Andrew K.指出的那樣,你不能給兩個實體使用相同的實體ID。

我不是設置IDP服務器的人,所以我無法控制其中的一部分(並且IDP元數據文件已提供給我,所以我只是認爲它沒有錯誤)。然而,爲了解決這個問題,我只是改變了IDP元數據文件中的entityID。我是SAML的新手,但我認爲這對我的具體實施沒有任何負面影響。

相關問題