【问题标题】:SAML / is RelayState required for signed logout request?SAML / 签名注销请求是否需要 RelayState?
【发布时间】:2016-02-08 23:04:58
【问题描述】:

我希望确认有效的已签名 SAML 注销请求需要 RelayState。

我们已将 Microsoft 的 ADFS 2012 R2 与 Oracle 的 Identity Federation 联合起来,其中 ADFS 是 SP,OIF 是 IdP。作为基础,我们关注了Integrating ADFS 2.0/3.0 SP with OIF IdP

一切正常,除了注销。我们有另一个 SP 正在注销并与 OIF 合作。我们发现的一个区别是 ADFS 没有发送 RelayState 参数及其签名的注销请求,但另一个 SP 是。我一直在使用SAMLTool's Validate Logout Req,在这里我输入了以下内容:

  • SAML 注销请求
  • 来源的EntityId
  • 目标 URL,注销请求的目的地
  • SigAlg
  • SAML 注销请求的签名
  • X.509 源证书(检查签名)
  • 忽略计时问题:选中

然后给我错误:

In order to check Signature you must provide the RelayState parameter and the X.509 cert

如果我在SAMLTool's Validate Logout Req 中输入 RelayState 以及我的其他值,那么它会报告我签名的注销请求是有效的。

在 ADFS 的情况下,因为它没有 RelayState 参数,我无法让SAMLTool's Validate Logout Req 说从 ADFS 注销是有效的。

话虽如此,我在 SAML 规范中找不到任何地方说签名注销请求需要 RelayState。任何人都可以确认它是必需的并用文档备份吗?

【问题讨论】:

    标签: single-sign-on saml


    【解决方案1】:

    LogoutRequest 消息不会引用RelayState 参数(正如另一篇文章所建议的那样),但它是用于在 SAML 各方之间传递消息的所谓绑定的一部分。假设注销使用HTTP-RedirectHTTP-POSTArtifact 绑定,规范允许 发送方包含RelayState 参数,然后接收方必须返回相同的RelayState参数作为响应的一部分(作为发送方保持状态的一种方式)。

    请参阅 SAML 绑定文档的第 3.4.3 节 RelayState:https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf 以了解 HTTP 重定向绑定:

    3.4.3 中继状态

    RelayState 数据可以包含在 SAML 协议消息中 这个绑定。该值不得超过 80 字节长度并且应该受到实体的完整性保护 创建独立于任何其他可能或可能的保护的消息 在消息传输过程中可能不存在。签约不现实 鉴于空间限制,但因为价值暴露于 第三方篡改,实体应该确保该值没有 被使用校验和、伪随机值或 类似的手段。如果 SAML 请求消息带有 RelayState 数据,则 SAML 响应者必须返回其 SAML 协议响应 使用也支持 RelayState 机制的绑定,并且它必须 将它与请求一起收到的确切数据放入 响应中对应的 RelayState 参数。如果没有这样的值 包含在 SAML 请求消息中,或者如果 SAML 响应 在没有相应请求的情况下生成消息,则 SAML 响应者可以包含 RelayState 数据以由 接收者基于个人资料的使用或双方之间的事先协议 当事人

    对于其他绑定,存在类似的部分。正如@nzpcmad 所说:在请求中包含它不是强制性的。

    【讨论】:

    • 换句话说,它不是强制性的。该工具的要求不正确。 ADFS 例如不为 SP Initiated 提供它。
    • 谢谢。我会接受这个作为答案,然后向 Oracle 开一张票,看看他们怎么说。如果有什么有趣的结果,我会尝试回到这里更新状态。
    • 我们最终解决了我们的问题,ADFS 和 OAM 之间的注销现在可以正常工作了。主要问题是 OAM 中的 ADFS 元数据过时。
    【解决方案2】:

    阅读 SAML LogoutRequestType 的 SAMLv2 核心规范“单一注销协议”XML 架构

    <element name="LogoutRequest" type="samlp:LogoutRequestType" />
    <complexType name="LogoutRequestType">
        <complexContent>
            <extension base="samlp:RequestAbstractType">
                <sequence>
                    <choice>
                        <element ref="saml:BaseID" />
                        <element ref="saml:NameID" />
                        <element ref="saml:EncryptedID" />
                    </choice>
                    <element ref="samlp:SessionIndex" minOccurs="0" maxOccurs="unbounded" />
                </sequence>
                <attribute name="Reason" type="string" use="optional" />
                <attribute name="NotOnOrAfter" type="dateTime" use="optional" />
            </extension>
        </complexContent>
    </complexType>
    <element name="SessionIndex" type="string" />
    

    没有提到 RelayState 元素。 SAMLv2 配置文件规范中的“单一注销配置文件”也没有提及 RelayState。

    我会说这表明 RelayState(这是一个请求参数,因此只能在前端通道绑定中使用)不是强制性的。

    【讨论】:

    • 谢谢,但我还是很困惑。根据您所说,鉴于规范未列出 RelayState,为什么要强制使用它?还是你最后一句话打错了?
    • RelayState 在 SAML 绑定规范中定义,而不是在核心 SAML 规范中。你什么也没发现并不奇怪(见@Hans Z. 回复)
    • 即使那里的参数是可选的
    猜你喜欢
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多