我正在尝试使用Okta从SpringBoot应用程序对用户进行身份验证。
我已经按照Okta教程从https://developer.okta.com/blog/2017/03/16/spring-boot-saml
设置了应用程序但是我的应用程序位于ELB的后面,因此TLS在LB处终止。因此,我已经修改了教程中的配置以适合我的需求。
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/saml*").permitAll()
.anyRequest().authenticated()
.and()
.apply(saml())
.serviceProvider()
.keyStore()
.storeFilePath(this.keyStoreFilePath)
.password(this.password)
.keyname(this.keyAlias)
.keyPassword(this.password)
.and()
.protocol("https")
.hostname(String.format("%s", serverName))
.basePath("/")
.and()
.identityProvider()
.metadataFilePath(this.metadataUrl);
}
这可以解决问题,但是有问题。 Okta验证用户身份后,最终将用户重定向到http URL而不是https URL。我认为这是因为TLS在LB处终止,而我的应用实际上正在接收带有HTTP的请求,该请求正在RelayState中发送。
这是我发现的东西:spring-boot-security-saml-config-options.md。 它包含用于春季启动安全性的SAML属性列表。我将以下内容添加到application.properties文件中
saml.sso.context-provider.lb.enabled = true
saml.sso.context-provider.lb.scheme=https
saml.sso.profile-options.relay-state=<https://my.website.com>
它不会更改http重定向。我在做错什么吗?
答案 0 :(得分:0)
当类似Okta的SAML 2.0 IdP重定向回您的应用程序时,端点URL要么基于您的应用程序公开的SAML 2.0元数据,要么基于IdP中的配置。
此外,在SAML 2.0 AuthnRequest中添加Destination属性是可选的:
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
Destination="https://my.website.com" IssueInstant="2018-11-22T09:23:08.844Z" Version="2.0" ID="id-f8ee3ab1-6745-42d5-b00f-7845b97fe953">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> ... </Issuer>
...
</samlp:AuthnRequest>