我正在使用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的
你有没有想过这个想法?今天我遇到了同样的事情,这是我能找到的唯一的问题。 –