Spring Security SAML2(不是SAML扩展)-由于HttpServerRequest URL和目标URL不匹配而导致身份验证异常

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

由于IDP中的HttpServletRequest URL和目标URL不匹配,OpenSamlAuthenticationProvider.validateSaml2Response验证异常如下所示:

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);
}