Spring saml 将请求重定向到 http

Posted

技术标签:

【中文标题】Spring saml 将请求重定向到 http【英文标题】:Spring saml redirects the request to http 【发布时间】:2015-09-27 06:41:15 【问题描述】:

我正在使用带有 Apache 2.2 + Tomcat 7.0 + OKTA(IdP) 的 spring saml 扩展。 securityContext.xml 如下所示:

元数据生成器过滤器:

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
    <constructor-arg>
        <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
            <property name="entityBaseURL" value="https://myapp.com/api"/>
        </bean>
    </constructor-arg>
</bean>

上下文提供者:

<bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB">
    <property name="scheme" value="https"/>
    <property name="serverName" value="myapp.com"/>
    <property name="serverPort" value="443"/>
    <property name="includeServerPortInRequestURL" value="false"/>
    <property name="contextPath" value="/api"/>
    <property name="storageFactory">
        <bean class="org.springframework.security.saml.storage.EmptyStorageFactory"/>
    </property>
</bean>

我使用以下 URL 触发 SP 发起的登录。

https://myapp.com/api/welcome.html

身份验证完成后,浏览器会被重定向到 HTTP 而不是 HTTPS。

 http://myapp.com/api/welcome.html

我不知道为什么请求会被重定向到 HTTP。请帮忙。

谢谢

奈良

HTTP 请求转储:

https://docs.google.com/document/d/1mYh-EhDjxMixzZ8krhOg_2fjpTaTu7fuST_nIXAMeVY/edit?usp=sharing

在 OKTA 中,使用以下元数据创建了一个 SAML 2.0 应用:

单点登录 URL => https://myapp.com/api/saml/SSO 收件人 URL => https://myapp.com/api/saml/SSO 目标网址 => https://myapp.com/api/saml/SSO 观众限制 => https://myapp.com/api/saml/metadata 默认中继状态 => https://myapp.com/dashboard.html 名称 ID 格式 => 未指定 响应 => 签名 断言签名 => 签名 签名算法 => RSA_SHA256 摘要算法 => SHA256 断言加密 => 未加密 SAML 单次注销 => 已禁用 authnContextClassRef => PasswordProtectedTransport 请求压缩 => 未压缩 荣誉部队认证 => 是 SAML 发行者 ID => http://www.okta.com/$org.externalKey

弹簧配置:

https://docs.google.com/document/d/16iDLcBuwvQ23-mKMFybPfxdIyvqCBi5sbYePgUjl0p4/edit?usp=sharing

【问题讨论】:

请转储 IDP 和 SP 之间的 HTTP 请求以及您导入 IDP 的元数据并将其添加到问题中。 弗拉基米尔:感谢您的休息。请根据要求在上方找到附加数据。 Okta 正在响应正确的地址“myapp.com/api/saml/SSO”,因此问题出在 Spring 配置中。您能否发布完整的 Spring 配置? 谢谢弗拉基米尔。请找到 spring 配置的链接。 【参考方案1】:

确保您的 IDP 配置了带有 https 断言端点的正确元数据 XML。

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

【讨论】:

欢迎来到 Stack Overflow!请确保您的答案被表述为作为答案,而不是作为问题。此外,XML 标记是不可见的,除非您将它们放在代码块中,就像我在这里所做的那样。【参考方案2】:

我仍然没有看到真正的原因,您的配置看起来不错,但请尝试将当前的 successRedirectHandler 替换为以下内容(当然,将 URL 替换为您自己的),看看问题是否消失:

<bean id="successRedirectHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
    <property name="defaultTargetUrl" value="https://yourapp.com/welcome.jsp"/>
</bean>

【讨论】:

谢谢弗拉基米尔。 1)如上设置defaultTargetUrl。尝试了/saml/login。身份验证后,浏览器进入 /welcome.jsp、myokta.com/app/dev400736_devserver_1/exk4e58o6u7P4jjrh0h7/sso/… 和 /saml/SSO 之间的重定向循环。 2) 从 /welcome.jsp(而不是 /saml/login)开始。重定向到 http://.../welcome.jsp 并且浏览器显示连接重置错误。之后,我将方案更改为 https 。然后,我就可以正常打开页面了。 弗拉基米尔,还有一个问题……tomcat 的 server.xml 有以下连接器。 。会不会是重定向问题的根源? 将安全属性添加到连接器后,重定向正确发生。 只是为那些仍有问题的人添加。除了这个修复之外,我还必须将 setAlwaysUseDefaultTargetUrl 设置为 true 才能正常工作。

以上是关于Spring saml 将请求重定向到 http的主要内容,如果未能解决你的问题,请参考以下文章

在 ELB 后面使用带有 Spring Boot 的 SAML 重定向到 http 而不是 https

Spring Security SAML,使用 SAMLContextProviderLB 设置为 HTTPs 方案时重定向到 HTTP 而不是 HTTPS

AADSTS750054:SAMLRequest 或 SAMLResponse 必须作为查询字符串参数出现在 SAML 重定向绑定的 HTTP 请求中

如何正确解码 Java 中的 SAML 请求(HTTP 重定向)?

使用 Java 创建“HTTP 重定向绑定”SAML 请求

如何验证 HTTP 重定向绑定的 SAML 签名