我希望确认有效签名的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,我输入以下内容:
然后给我错误:
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是签名注销请求所必需的。任何人都可以确认它是必需的并备份文档吗?
答案 0 :(得分:3)
LogoutRequest
消息不会引用RelayState
参数(如其他帖子所示),但它是用于在SAML各方之间传递消息的所谓绑定的一部分。假设Logout使用HTTP-Redirect
,HTTP-POST
或Artifact
绑定,规范允许让发件人包含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(这是一个请求参数,因此只能在前端通道绑定中使用)不是强制性的。