我有一个Spring启动web应用程序,它使用由https://samltest.id/。
它在本地主机上运行良好,但现在我正试图将它放在具有Nginx的服务器上。Ngnix的配置使任何http请求都重定向到https和https://myserver.company.com/myApp/发送到http://local_ip:local_port/。
如果应用程序没有安全性,但使用SAML,这个cfg可以正常工作,结果是:当我访问应用程序的主页时,我会重定向到登录页面(正确(,成功登录后,我会被重定向到https://myserver.company.com/saml/SSO/而不是https://myserver.company.com/myApp/saml/SSO所以Nginx给出了404。
元数据.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"/>
请注意,URL是基于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但这一次我从web应用程序得到了一个404,而不是Nginx(错误页面不同(。
我错过了什么?
更新:第三次尝试
- 将
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 URL(
现在,在成功登录后,我被重定向到https://myserver.company.com/myApp/saml/SSO正如预期的那样,但我从应用程序中得到了一个401,消息为"Authentication Failed:Incoming SAML message is invalid",并且在应用程序日志中有"org.pensaml.com.mon.SAMLException:Unsupported request"。
经过几次尝试,我找到了解决方案。无需修改SAMLProcessingFilter
或上下文根。关键是使用SAMLContextProviderLB
,而不是本手册"高级配置"一章中所述的SAMLContextProviderImpl
。此外,我的问题中已经描述的entityBaseURL
更改也是必要的(它也在手册中(。