SAML /是签名注销请求所需的RelayState吗?

时间:2016-02-08 23:04:58

标签: single-sign-on saml

我希望确认有效签名的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
  • 目标网址,退出请求的目的地
  • 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是签名注销请求所必需的。任何人都可以确认它是必需的并备份文档吗?

2 个答案:

答案 0 :(得分:3)

LogoutRequest消息不会引用RelayState参数(如其他帖子所示),但它是用于在SAML各方之间传递消息的所谓绑定的一部分。假设Logout使用HTTP-RedirectHTTP-POSTArtifact绑定,规范允许让发件人包含RelayState参数和接收者然后必须返回相同的RelayState参数作为响应的一部分(作为发送者保持状态的一种方式)。

参见3.4.3 SAML绑定文档的RelayState:HTTP {Redirect绑定的https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf

  

3.4.3 RelayState

     

RelayState数据可以包含在与之一起传输的SAML协议消息中   这种约束力。值不得超过80   长度为字节,应该由实体保护完整性   创建消息独立于任何其他可能或保护   在消息传输期间可能不存在。签名是不现实的   考虑到空间限制,但因为价值暴露   第三方篡改,实体应该确保价值没有   通过使用校验和,伪随机值或篡改被篡改   类似的手段。如果SAML请求消息伴随有RelayState   数据,然后SAML响应者必须返回其SAML协议响应   使用也支持RelayState机制的绑定,它必须   将收到的确切数据与请求放入   响应中对应的RelayState参数。如果没有这样的价值   包含在SAML请求消息中,或者SAML响应中   正在生成没有相应请求的消息,然后是   SAML响应者可以包含要由其解释的RelayState数据   收件人基于使用个人资料或之前的协议   方

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

答案 1 :(得分:0)

阅读SAML LogoutRequestType的SAMLv2核心规范“Single Logout Protocol”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(这是一个请求参数,因此只能在前端通道绑定中使用)不是强制性的。