SAML 断言失败

Posted

技术标签:

【中文标题】SAML 断言失败【英文标题】:SAML assertion fails 【发布时间】:2018-11-09 20:39:51 【问题描述】:

我有一个使用 Okta 作为 IDP 的 Spring-SAML 应用程序。我正在做 IDP 发起的流程和 得到这个例外:

org.opensaml.common.SAMLException: Endpoint with message binding urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST and URL https://<myCompanyUrl>.com/saml/SSO wasn't found in local metadata

当我查看本地元数据时,我看到:

 <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                                 Location="https://<server IP address> :<server port>/saml/SSO" index="0" isDefault="true"/>

看起来它正在尝试将包含主机名的 URL 与具有服务器 IP 地址的 URL 匹配。位置字段是自动生成的。有人知道什么配置选项会影响这个吗?


更新 1

这是我的 metadataGeneratorFilter 配置:

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
    <constructor-arg>
        <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
            <property name="entityId" value="https://myHostname/myApp"/>
        </bean>
    </constructor-arg>
</bean>

【问题讨论】:

看起来在 Okta 的通用 SAML 设置中有一个选项,称为 URL 上的单一登录 【参考方案1】:

好吧,谜团解开了:

根据 Spring-SAML 文档,当您处于反向代理/负载平衡器设置中时,您必须确保指定

<property name="entityBaseURL" value="https://www.myserver.com/spring-security-saml2-sample"/>

见SPRING-SAML documentation 10.1 反向代理和负载均衡器

【讨论】:

以上是关于SAML 断言失败的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security SAML - 无法验证签名

SAML EncryptedAssertion解密失败

ADFS 服务器上的 SAML LogOutRequest 处理失败

HTTP 状态 401 - 身份验证失败:解码传入 SAML 消息时出错

Spring SAML 握手失败 - 无法针对受信任的密钥验证不受信任的凭据

如何解决 org.springframework.web.util.NestedServletException:请求处理失败;使用 SAML