3

由于 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 名称。
  • 我们的应用程序位于负载均衡器后面。
  • 我们尝试将 proxyName 和 proxyHost 添加到 Tomcat 中的 Http 连接器。我们的协议仍然不匹配,我们不相信这是正确的方法。
  • 这一定是一个常见的问题,以至于我们没有使用的 Spring SAML 扩展有一个配置类来处理这个确切的问题。
  • 我认为我们不能使用拦截器,因为 HttpServletRequest URL 不可修改。

想知道是否有其他人处理过类似的事情并找到了解决方案。

4

1 回答 1

0

首先,让我们通过启用详细登录来确定不匹配的位置,例如 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);
}

欲了解更多信息,请随时查看令人惊叹的https://docs.spring.io/spring-security/site/docs/5.4.1/reference/html5/#servlet-saml2文档(比旧https的文档好得多://spring.io/projects/spring-security-saml )

于 2020-10-27T21:16:34.707 回答