2015-11-26 60 views
1

我正在使用One Login實施Spring Security SAML。我已經設置了所有的配置文件和元數據。Spring Security SAML One登錄全球單一註銷登出請求解析問題

我能夠獲得登錄工作和註銷工作,如果我從我登錄同一個應用程序註銷。在從SAML IDP這種情況下,我得到LogoutResponse和Spring Security可以解析和處理它。

http://localhost:8080/web/saml/SingleLogout?SAMLResponse= ..............

問題是,當我登錄的兩個應用程序,目前我登錄到一個登錄管理控制檯,還有一個鏈接我的應用程序,我點擊它,我可以直接在我的應用程序登錄,現在當我從One Login管理控制檯註銷時,我的應用程序獲取LogoutRequest

http://localhost:8080/web/saml/SingleLogout?SAMLRequest= .........

春季安全解析它精緻和傳遞對象驗證檢查邏輯。

org.springframework.security.saml.websso.processLogoutRequest(SAMLMessageContext context, SAMLCredential credential) 

該方法有以下檢查。

// Make sure request was authenticated if required, authentication is done as part of the binding processing 
     if (!context.isInboundSAMLMessageAuthenticated() && context.getLocalExtendedMetadata().isRequireLogoutRequestSigned()) { 
      throw new SAMLStatusException(StatusCode.REQUEST_DENIED_URI, "LogoutRequest is required to be signed by the entity policy"); 
     } 

我試圖跟蹤跟蹤,但上下文對象的字段inboundSAMLMessageAuthenticated從未設置爲true。上述檢查失敗並拋出異常。

在調試模式下,我明確指出值爲真,它繼續前進,但還有一個問題。

在同一個方法中還有另一個檢查。

try { 
      // Fail if NameId doesn't correspond to the currently logged user 
      NameID nameID = getNameID(context, logoutRequest); 
      if (nameID == null || !equalsNameID(credential.getNameID(), nameID)) { 
       throw new SAMLStatusException(StatusCode.UNKNOWN_PRINCIPAL_URI, "The requested NameID is invalid"); 
      } 
     } catch (DecryptionException e) { 
      throw new SAMLStatusException(StatusCode.RESPONDER_URI, "The NameID can't be decrypted", e); 
     } 

該方法equalsNameId如下。

private boolean equalsNameID(NameID a, NameID b) { 
     boolean equals = !differ(a.getSPProvidedID(), b.getSPProvidedID()); 
     equals = equals && !differ(a.getValue(), b.getValue()); 
     equals = equals && !differ(a.getFormat(), b.getFormat()); 
     equals = equals && !differ(a.getNameQualifier(), b.getNameQualifier()); 
     equals = equals && !differ(a.getSPNameQualifier(), b.getSPNameQualifier()); 
     equals = equals && !differ(a.getSPProvidedID(), b.getSPProvidedID()); 
     return equals; 
    } 

這失敗而有所不同(a.getFormat(),b.getFormat())

問題

我不知道是有什麼我失蹤,有些丟失在哪裏去檢查解決這個問題。

我的單點登出綁定是HTTP重定向

如果提供了指針,將不勝感激。讓我知道是否需要更多信息。

感謝您的時間。

堆棧(傳統應用程序):

春天3.0。6

春季安全3.1.2

Spring Security的SAML 1.0.0

的Tomcat 7.x的

+0

你有沒有想過這個想法?今天我遇到了同樣的事情,這是我能找到的唯一的問題。 –

回答

0

具有原職後遇到了這個兩年,我不得不做一些進一步的研究。關於SAML規範,我仍然有一些閱讀要做,但我想我在SAML 2.0勘誤中找到了名稱ID和發行者之下的NameIDType結構的條目。這種類型的所有四個元素都是可選的。 OneLogin似乎跟隨此文檔,並且不會在SingleLogout請求中發送NameID.Format。

因此,inboundMessage具有空格式的nameID,而憑證的nameID格式爲「urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress」。這是導致getFormat行返回false並導致整個檢查失敗的原因。