Spring SAML发送错误的AuthNRequest

时间:2018-12-18 12:06:26

标签: spring single-sign-on saml-2.0 spring-saml

长期以来一直遇到这个问题,我们将不胜感激。

我正在为我的应用程序实现Spring SAML SSO身份验证。 它实际上是一个巨大的安全配置文件,因此,我将仅附加我认为可能很重要的配置部分。

@Bean
    public MetadataGenerator metadataGenerator() {
        MetadataGenerator metadataGenerator = new MetadataGenerator();
        metadataGenerator.setEntityId(env.getProperty("saml.entity.id"));
        metadataGenerator.setExtendedMetadata(extendedMetadata());
        metadataGenerator.setIncludeDiscoveryExtension(false);
        metadataGenerator.setKeyManager(keyManager());
        return metadataGenerator;
    }

@Bean
    @Qualifier("idp-ssocircle")
    public ExtendedMetadataDelegate ssoCircleExtendedMetadataProvider() throws MetadataProviderException {
        String idpSSOCircleMetadataURL = env.getProperty("saml.provider.url");
        HTTPMetadataProvider httpMetadataProvider = new HTTPMetadataProvider(this.backgroundTaskTimer, httpClient(),
                idpSSOCircleMetadataURL);
        httpMetadataProvider.setParserPool(parserPool());
        ExtendedMetadataDelegate extendedMetadataDelegate = new ExtendedMetadataDelegate(httpMetadataProvider,
                extendedMetadata());
        extendedMetadataDelegate.setMetadataTrustCheck(true);
        extendedMetadataDelegate.setMetadataRequireSignature(false);
        backgroundTaskTimer.purge();
        return extendedMetadataDelegate;
    }

我们在此bean中使用的属性文件的值为-

saml.entity.id=urn:saml2:test:s
saml.provider.url=https://fedsvc-stage.pwc.com/ofiss/FederationMetadata/2007-06/FederationMetadata.xml

我的spring应用程序托管在本地计算机上,并且IDP公开可用。我已经在主机文件中添加了条目,因此我的ip被映射为mysso.com

现在,我正在尝试访问SAML身份验证后面的网址-

http://mysso.com:8080/sso-self/auth/login

用户get重定向到IDP,在那里他输入凭据,并且在成功身份验证后,用户get重定向回- http://localhost:8080/sso-self/saml/SSO,具有saml响应,但我在浏览器上得到404,并在控制台上看到以下错误-

org.opensaml.common.SAMLException: InResponseToField of the Response doesn't correspond to sent message a330ei589j3e99ee10d8a55bghc518i

我看到的问题是,由于第一个请求来自域名 mysso.com ,消息正在从2个不同的会话中存储和检索,但响应又返回到 localhost

这是我的AuthnRequest XML,正在发送给IDP

<?xml version="1.0" encoding="UTF-8"?><saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="http://localhost:8080/madison-sso-self/saml/SSO" Destination="https://fedsvc-stage.pwc.com/ofiss/" ForceAuthn="false" ID="a345ia5236e6hc2g48ea13fcf4386h7" IsPassive="false" IssueInstant="2018-12-18T07:46:41.812Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0">
   <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">urn:saml2:test:s</saml2:Issuer>
</saml2p:AuthnRequest>

我所能理解的是AuthnRequest中的AssertionConsumerServiceURL值为http://localhost:8080/madison-sso-self/saml/SSO,这就是为什么它返回该URL的原因。 现在我不明白为什么这个值是localhost而不是我的主机名http://mysso.com:8080/madison-sso-self/saml/SSO

如果您需要更多信息以解决问题,请回复。 预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用 SAMLContextProviderLB 来解决此问题。请将以下配置中的值替换为您的服务器 URL。

@Bean
public SAMLContextProviderLB contextProvider() {
  SAMLContextProviderLB samlContextProviderLB = new SAMLContextProviderLB();
  samlContextProviderLB.setScheme("https");
  samlContextProviderLB.setServerName("www.myserver.com");
  samlContextProviderLB.setServerPort(443);
  samlContextProviderLB.setContextPath("/spring-security-saml2-sample");
  samlContextProviderLB.setStorageFactory(new EmptyStorageFactory());
  return samlContextProviderLB;
}

上述配置将使用 https://www.myserver.com/spring-security-saml2-sample/saml/SSO 从 SAML 服务提供商重定向。

samlContextProviderLB.setStorageFactory(new EmptyStorageFactory());

以上行将有助于解决多会话问题。

答案 1 :(得分:0)

请参阅“ spring-security-saml”文档中的以下段落: https://docs.spring.io/autorepo/docs/spring-security-saml/1.0.x-SNAPSHOT/reference/htmlsingle/#chapter-troubleshooting 在SSO中出现错误“ InResponseToField与发送的消息不对应”

确保在发送请求和接收响应期间,应用程序使用相同的HttpSession。通常,当从本地主机地址或http方案初始化身份验证请求,而在公共主机名或https方案中收到响应时,就会出现此问题。例如,从URL https://host:port/app/saml/login初始化身份验证时,必须在https://host;port/app/saml/SSO而不是http://host:port/app/saml/SSOhttps://localhost:port/app/saml/SSO处收到响应。

查看是否可以使用相同的公用DNS名称而不是localhost访问应用程序