Nginx 背后的 Spring SAML 2.0

Posted

技术标签:

【中文标题】Nginx 背后的 Spring SAML 2.0【英文标题】:Spring SAML 2.0 behind Nginx 【发布时间】:2020-06-27 19:26:19 【问题描述】:

我有一个使用 https://samltest.id/ 提供的 SAML 身份验证的 Spring-boot Web 应用程序。

它在 localhost 上运行良好,但现在我试图将它放在具有 nginx 的服务器上。 Ngnix 被配置为将任何 http 请求重定向到 https 并将 https://myserver.company.com/myApp/ 发送到 http://local_ip:local_port/ 。

如果应用程序没有安全性但使用 SAML,则此 cfg 工作正常,结果是:当我访问应用程序的主页时,我被重定向到登录页面(正确),成功登录后,我被重定向到 @ 987654324@ 而不是 https://myserver.company.com/myApp/saml/SSO 所以 Nginx 给出 404。

metadata.xml 包含:

<md:AssertionConsumerService Location="http://myserver.company.com:80/saml/SSO"
    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" isDefault="true" index="0"/>
<md:AssertionConsumerService Location="http://myserver.company.com:80/saml/SSO"
    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" index="1"/>

请注意,网址是基于 http 的。

经过大量谷歌搜索后,我尝试了以下方法:我修改了SAMLProcessingFilter 配置,使filterProcessesUrl 属性为"/myApp/saml/SSO",而不是默认值"/saml/SSO"

现在 metadata.xml 包含:

<md:AssertionConsumerService Location="http://myserver.company.com:80/myApp/saml/SSO"
    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" isDefault="true" index="0"/>
<md:AssertionConsumerService Location="http://myserver.company.com:80/myApp/saml/SSO"
    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" index="1"/>

登录后我被重定向到https://myserver.company.com/myApp/saml/SSO,但这次我从网络应用程序而不是 Nginx 得到 404(错误页面不同)。

我错过了什么?

更新:第三次尝试

SAMLProcessingFilter cfg 恢复为默认值, 将我的应用的上下文根修改为http://local_ip:local_port/myApp, 修改了 Nginx 配置文件以便 https://myserver.company.com/myApp/ 映射 到http://local_ip:local_port/myApp(相同的上下文根), 将MetadataGeneratorentityBaseURL属性设置为https://myserver.company.com/myApp, 已将新的 metadata.xml 上传到 https://samltest.id/(现在它包含 https URL)。

现在,在成功登录后,我按预期重定向到 https://myserver.company.com/myApp/saml/SSO,但我从应用程序收到 401 消息“身份验证失败:传入的 SAML 消息无效”,并且在应用程序日志中有“org.opensaml .common.SAMLException:不支持的请求”。

【问题讨论】:

元数据必须反映用户代理可以访问的 URL。如果您在 HTTP 反向代理上进行路径映射,则需要采用 SecurityConfig 来反映这一点。 @BernhardThalmayr 请用完整的答案更好地解释。在我的第二次尝试中,元数据包含一个可通过 Nginx 访问的 URL,Nginx 将其映射到通常的 /saml/SSO,我认为它由我的应用程序处理。我的 Java 配置中也有 http.authorizeRequests().antMatchers("/saml/**").permitAll() 【参考方案1】:

经过多次尝试,我找到了解决方案。 无需修改SAMLProcessingFilter 或上下文根。关键是使用SAMLContextProviderLB 而不是SAMLContextProviderImpl,如手册“Advanced configuration”一章所述。我的问题中已经描述的entityBaseURL 更改也是必要的(它也在手册中)。

【讨论】:

以上是关于Nginx 背后的 Spring SAML 2.0的主要内容,如果未能解决你的问题,请参考以下文章

为啥 spring-saml-extension 和 adfs 2.0 返回 403 错误?

Spring - 如何使用 SAML 2.0 实现单点登录

Angular(SPA) 前端和 Spring Boot 后端的 SAML 2.0 集成

配置 ADFS 3.0 / SAML 2.0 以使用 Spring Security 进行 SSO 集成

Spring MVC 中的 Okta SAML 2.0 实现(不是 Spring 引导)

Spring SAML 2.0 - 导入 IDP 的本地元数据 - MetadataProviderException