2014-11-14 159 views
0

我們有一個使用Spring SAML擴展的應用程序,我們已經將它設置爲一個在本地主機上針對SSOCircle運行的SP。我們現在已經部署在我們客戶的測試環境中,我們正試圖讓它與我們客戶的IDP一起工作。SAML DNS解決方案問題

我們給元數據給了IDP,用http://myapp-test.acme.com:8080/myapp/saml/SSO代替http://localhost:8080/myapp/saml/SSO

認證後,我們看到這在日誌中:

o.s.s.s.m.MetadataGeneratorFilter - 生成默認的實體基礎URL http://someappserver.acme.com:8080/myapp基於第一服務器請求的值。

org.opensaml.common.SAMLException:預期的目標 http://myapp-test.acme.com:8080/myapp/saml/SSO不匹配任何的輪廓甕端點網址:綠洲:名稱:TC:SAML:2.0:型材:SSO:瀏覽

在瀏覽器窗口,我們看到請求去http://someappserver.acme.com:8080/myapp/saml/SSO

所以http://myapp-test.acme.com:8080/myapp/saml/SSO解析

http://someappserver.acme.com:8080/myapp/saml/SSO

我們怎樣才能改變我們的代碼/配置來處理呢?我認爲我們不應該將元數據硬編碼到應用服務器。

回答

3

服務提供商元數據中的URL必須對應於您的服務提供商從IDP接收SAML消息的真實URL。在這種情況下,兩者不同。

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter"> 
    <constructor-arg> 
     <bean class="org.springframework.security.saml.metadata.MetadataGenerator"> 
      <property name="entityBaseURL" value="http://myapp-test.acme.com:8080/myapp"/> 
     </bean> 
    </constructor-arg> 
</bean> 

沒有設置該屬性,春SAML定義entityBaseURL並基於它生成的元數據:

您可以通過提供物業entityBaseURL,用正確的URL,例如更新securityContext.xml和變化豆metadataGeneratorFilter首先請求它收到。如果您的應用程序在多個URL上可用,則這當然可以是與您的IDP實際發送消息的URL不同的URL。

如果應用程序服務器看到的內部URL與調用者使用的URL不同(如同您的DNS解析一樣),您可以強制Spring SAML認爲它部署在特定公共URL後面,方法是更改豆contextProvider到:

<bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB"> 
    <property name="scheme" value="http"/> 
    <property name="serverName" value="myapp-test.acme.com"/> 
    <property name="serverPort" value="8080"/> 
    <property name="includeServerPortInRequestURL" value="true"/> 
    <property name="contextPath" value="/myapp"/> 
</bean> 

你可以在春SAML手動章Reverse proxies and load balancers更多細節。