2015-11-26 57 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并导致整个检查失败的原因。