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(错误页面不同)。
我错过了什么?
更新:第三次尝试
- 将
SAMLProcessingFilter
cfg 恢复为默认值,
- 将我的应用程序的上下文根修改为 http://local_ip:local_port/myApp ,
- 修改了 Nginx cfg 以便 https://myserver.company.com/myApp/ 映射
到 http://local_ip:local_port/myApp(相同的上下文根),
- 将
MetadataGenerator
的 entityBaseURL
属性 设置为 https://myserver.company.com/myApp ,
- 已将新的 metadata.xml 上传到 https://samltest.id/(现在它包含 https 网址)。
现在,成功登录后,我按预期重定向到 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
更改是必要的(它也在手册中)。
我有一个 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(错误页面不同)。
我错过了什么?
更新:第三次尝试
- 将
SAMLProcessingFilter
cfg 恢复为默认值, - 将我的应用程序的上下文根修改为 http://local_ip:local_port/myApp ,
- 修改了 Nginx cfg 以便 https://myserver.company.com/myApp/ 映射 到 http://local_ip:local_port/myApp(相同的上下文根),
- 将
MetadataGenerator
的entityBaseURL
属性 设置为 https://myserver.company.com/myApp , - 已将新的 metadata.xml 上传到 https://samltest.id/(现在它包含 https 网址)。
现在,成功登录后,我按预期重定向到 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
更改是必要的(它也在手册中)。