长期以来一直遇到这个问题,我们将不胜感激。
我正在为我的应用程序实现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。
如果您需要更多信息以解决问题,请回复。 预先感谢。
答案 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/SSO或https://localhost:port/app/saml/SSO处收到响应。
查看是否可以使用相同的公用DNS名称而不是localhost访问应用程序