附上SAMLContextProviderLB bean的上下文提供程序
**<property name="scheme" value="https"/>**
<property name="serverName" value="${sp.hostname}"/>
<property name="serverPort" value="#{'${sp.ssl.port}'=='' ? 443 : '${sp.ssl.port}'}"/>
<property name="includeServerPortInRequestURL" value="#{'${sp.ssl.port}'=='443' ? false : true }"/>
<property name="contextPath" value="/${sp.context.root}"/>
我在反向代理服务器后面,所以我正在卸载SSL终端。后端服务器本身正在侦听非SSL,但是webtier正在为我们终止SSL并转发到非ssl端口。我已经设置了具有上述属性的SAMLContextProviderLB,因此即使后端是https,它也会知道将saml令牌的预期收件人映射为https受众。然而,当我访问受保护资源时,我在下面的日志中看到了它在浏览器上返回的垃圾。当我在浏览器中将其更改为https时,它可以按预期工作。查看下面的日志显示从DefaultSavedRequest url 返回的值是HTTP,当它应该是HTTP时。
2016-03-07 18:24:11,907 INFO org.springframework.security.saml.log.SAMLDefaultLogger.log:127 - AuthNResponse; SUCCESS; 10.4.203.88; https://myserver:89/fct;https://www.myADFS.com/adfs/services/trust;camachof@email.com ;;
2016-03-07 18:24:11,909 DEBUG org.springframework.security.saml.SAMLProcessingFilter.successfulAuthentication:317 - 身份验证成功。更新SecurityContextHolder以包含:org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237:校长:camachof@email.com;证书:[保护];认证:真实;细节:null;没有授予任何权力
2016-03-07 18:24:11,910 DEBUG org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess:79 - 重定向到 DefaultSavedRequest 网址: http :// MYSERVER:89 / FCT /页
2016-03-07 18:24:11,911 DEBUG org.springframework.security.web.DefaultRedirectStrategy.sendRedirect:36 - 重定向到'http://myserver:89/fct/page'
2016-03-07 18:24:11,911 DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository.saveContext:292 - 存储到HttpSession的SecurityContext:'org.springframework.security.core.context.SecurityContextImpl@830e9237:身份验证:org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237:校长:camachof@email.com;证书:[保护];认证:真实;细节:null;没有授予任何权力机构
2016-03-07 18:24:11,912 DEBUG org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter:97 - SecurityContextHolder现已清除,请求处理完成
如何在此设置下将此强制转换为HTTPS?提前谢谢。
答案 0 :(得分:5)
这个问题很陈旧,但如果我发现其他人可能会这样,我会发布一个答案。
您的负载均衡器或您的反向代理(Apache httpd
或nginx
)必须为您做一些额外的工作。 Spring
(或Spring Boot
)和嵌入式Tomcat
(或Jetty
)认为他们正在运行http服务器。这是在做什么。如果代理传递了一些头变量,Tomcat将开始认为它正在运行https
。
以下是Apache需要的例子:
ProxyPreserveHost On
RequestHeader add X-Forwarded-Proto https
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ProxyPass
和ProxyPassReverse
是你可能已经拥有的。但ProxyPreserveHost
和X-Forwarded-Proto
确实很重要。
查看Spring Boot Docs的此部分。如果设置了X-Forwarded-For
或X-Forwarded-Proto
,则需要将其添加到application.properties文件中:
server.use-forward-headers=true
您还将在该文档中看到,您可以为Tomcat特定配置添加这些属性:
server.tomcat.remote-ip-header=x-your-remote-ip-header
server.tomcat.protocol-header=x-your-protocol-header
将上述所有 完成上述内容后,它将开始工作。您上面的内容本身并不足以强制Tomcat开始使用https
转发请求。
我发现由于我的公司有一个基于硬件的负载均衡器(由Rackspace管理),因此很难对其进行配置以进行这些更改。因此,我们在防火墙/负载均衡器中进行SSL终止,然后将请求转发到端口80上的Apache,并且Apache将它们转发到端口8080上的Java。是的,这是一团糟。但它让所有这些废话无效。