问题描述
我正在使用 spring security saml 扩展实现多租户应用程序。
我为每个租户都有一个服务提供商 (SP)。 所有 SP 都在使用 SP 特定的二级域公开的同一台服务器上运行:
- sp1.myapp.com/myapi/1/
- sp1.myapp.com/myapi/2/
在每个 SP 元数据文件中,我都配置了特定于租户的 AssertionConsumerService。
当我测试 SSO 登录时,当它得到身份提供者 (IDP) 的响应时,我在 SP 端得到一个 KO。 在日志方面,我只看到:
ERROR [BaseSAMLMessageDecoder] SAML message intended destination endpoint 'https://sp1.myapp.com/myapi/saml/SSO' did not match the recipient endpoint 'https://default.myapp.com/myapi/saml/SSO'
其中“https://default.myapp.com/myapi/saml/SSO”是设置为负载均衡器上下文提供程序的serverName的 URL:
<bean id="lbContextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB" init-method="afterPropertiesSet">
<property name="Metadata" ref="Metadata" />
<property name="keyManager" ref="keyManager" />
<property name="scheme" value="https" />
<property name="serverName" value="default.myapp.com" />
<property name="contextpath" value="/myapi" />
<property name="serverPort" value="443" />
<property name="includeServerPortInRequestURL" value="true" />
</bean>
问题
在 docs.spring.io/spring-security-saml 中,我看到了
服务提供者现在可以定义多个具有相同绑定的断言消费者端点
- 我该如何配置?
- 它是否与负载平衡器上下文提供程序冲突?
- 我能否提供多个具有不同二级域的 AssertionConsumerService 而不会重现此冲突?
我已经测试过了:
- This question 似乎与 LB 一起修复了,但有人知道我是否可以向负载均衡器上下文提供程序提供多个 serverName(也许使用动态选择)?
- 按照 ch.13 docs.spring.io/spring-security-saml 以及 this 和 this question 的建议禁用对 InResponsetoField 的检查。
- 按照 this question 的建议配置 successRedirectHandler 的 defaultTargetUrl(我在其中使用 org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler 的自定义超类)。此外,此解决方案不是多租户的。
<bean id="successRedirectHandler" class="org.MySamlAuthenticationSuccessHandler"
init-method="afterPropertiesSet">
<property name="contextpath" value="/myapi" />
<property name="defaultTargetUrl" value="https://default.myapp.com/myapi/saml/SSO"/>
<property name="requireProxyWrapping" value="false"/>
</bean>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)