Spring Security SAML2(不是SAML扩展)-由于HttpServerRequest URL和目标URL不匹配而导致身份验证异常
由于IDP中的HttpServletRequest URL和目标URL不匹配,OpenSamlAuthenticationProvider.validateSaml2Response验证异常如下所示:Spring Security SAML2(不是SAML扩展)-由于HttpServerRequest URL和目标URL不匹配而导致身份验证异常,spring,spring-security,saml-2.0,spring-security-saml2,Spring,Spring Security,Saml 2.0,Spring Security Saml2,由于IDP中的HttpServletRequest URL和目标URL不匹配,OpenSamlAuthenticationProvider.validateSaml2Response验证异常如下所示: if (StringUtils.hasText(samlResponse.getDestination()) && !recipient.equals(samlResponse.getDestination())) { throw this.authExce
if (StringUtils.hasText(samlResponse.getDestination()) && !recipient.equals(samlResponse.getDestination())) {
throw this.authException("invalid_destination", "Invalid SAML response destination: " + samlResponse.getDestination());
}...
- HttpServletRequest URL返回SAML请求的源应用服务器的主机名(localhost:port),而不是dns名称
- 我们的应用程序在负载均衡器后面
- 我们试图向Tomcat中的Http连接器添加proxyName和proxyHost。我们仍然有一个不匹配的协议,我们不相信这是正确的方法李>
- 这一定是一个常见的问题,因此Spring SAML扩展(我们不使用它)有一个config类来处理这个问题
- 我认为我们不能使用拦截器,因为HttpServletRequestURL是不可修改的
想知道是否有其他人处理过类似的问题并找到了解决方案。首先,让我们通过详细登录来确定不匹配的位置 例如,对于log4j,配置片段将如下所示:
...
log4j.logger.org.springframework.security.saml2.provider.service.authentication=TRACE
log4j.logger.org.opensaml.saml.saml2.assertion.impl=TRACE
其次,让我们像下面这样手工制作RelyingPartyRegistrationRepository
(调用assertionConsumerServiceLocation
将覆盖元数据中的值)
要了解更多信息,请毫不犹豫地查看令人惊叹的文档(比旧文档好得多)
@Bean
public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository1() {
String consumerServiceLocationFixed = "https://some_host:some_port/some_path/login/saml2/sso/{registrationId}";
RelyingPartyRegistration rp = RelyingPartyRegistrations
.fromMetadataLocation("assertingPartyMetadataLocation")
.assertionConsumerServiceLocation(consumerServiceLocationFixed)
.registrationId("some_idp")
.build();
return new InMemoryRelyingPartyRegistrationRepository(rp);
}