Spring Nginx 背后的 SAML 2.0

Spring SAML 2.0 behind Nginx

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

它在本地主机上运行良好,但现在我正试图将它放在装有 Nginx 的服务器上。 Ngnix 配置为任何 http 请求都重定向到 https 和 https://myserver.company.com/myApp/ is sent to http://local_ip:local_port/ .

如果应用程序没有安全性但使用 SAML,此 cfg 工作正常,结果是:当我访问应用程序的主页时,我被重定向到登录页面(正确),成功登录后我被重定向到 https://myserver.company.com/saml/SSO/ instead of 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 的。

经过大量 Google 搜索后,我尝试了以下操作: 我修改了 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 但这次我从 Web 应用程序而不是 Nginx 获得 404(错误页面不同)。

我错过了什么?

更新:第三次尝试

现在,成功登录后,我按预期重定向到 https://myserver.company.com/myApp/saml/SSO,但我从应用程序收到 401 消息 "Authentication Failed: Incoming SAML message is invalid",并且在应用程序日志中有 "org.opensaml.common.SAMLException: Unsupported request" .

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