当前位置: 首页 > 知识库问答 >
问题:

SAML/签名的注销请求是否需要RelayState?

万俟财
2023-03-14

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

我们已经将微软的ADFS 2012 R2与甲骨文的身份联合会联合起来,其中ADFS是SP,OIF是IdP。作为基础,我们遵循将ADFS 2.0/3.0 SP与OIF IdP集成。

一切正常,除了注销。我们有另一个 SP 执行注销并与 OIF 合作。我们发现的一个区别是,ADFS 不会发送带有其签名注销请求的 RelayState 参数,但另一个 SP 会发送。我一直在使用SAMLTool的验证注销要求,我输入以下内容:

  • SAML 注销请求
  • 源的实体 Id
  • 目标 URL,注销请求的目标
  • SigAlg
  • SAML 注销请求的签名
  • 源的 X.509 证书(用于检查签名)
  • 忽略计时问题:已选中

然后这给了我一个错误:

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

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

对于 ADFS,由于它没有 RelayState 参数,因此我无法获取 SAMLTool 的 Validate Logout Req 来说明从 ADFS 注销是有效的。

尽管如此,我在SAML规范中找不到任何地方说RelayState是签名注销请求所必需的。有人能确认它是必需的并用留档备份吗?

共有2个答案

锺离晗昱
2023-03-14

读取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 Element。SAMLv2 配置文件规范中的“单一注销配置文件”也没有提到 RelayState。

我认为这表明RelayState(这是一个请求参数,所以只能用于前通道绑定)不是强制的。

蒲坚
2023-03-14

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

有关HTTP-Redirect绑定,请参见SAML绑定文档的第3.4.3节relay state:https://docs . oasis-open . org/security/SAML/v 2.0/SAML-bindings-2.0-OS . pdf:

3.4.3 RelayState

RelayState 数据可以包含在与此绑定一起传输的 SAML 协议消息中。该值的长度不得超过 80 个字节,并且应由创建消息的实体独立于在消息传输过程中可能存在或可能不存在的任何其他保护措施进行完整性保护。鉴于空间限制,签名是不现实的,但由于该值暴露给第三方篡改,因此实体应确保该值未被使用校验和、伪随机值或类似方法篡改。如果 SAML 请求消息附带 RelayState 数据,则 SAML 响应程序必须使用也支持 RelayState 机制的绑定返回其 SAML 协议响应,并且它必须将随请求一起收到的确切数据放入响应中相应的 RelayState 参数中。如果 SAML 请求消息中不包含此类值,或者如果 SAML 响应消息在没有相应请求的情况下生成,则 SAML 响应程序可以包含 RelayState 数据,以便接收方根据配置文件的使用或双方之间的先前协议进行解释

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

 类似资料:
  • 以下是发送给ADFS的SAML请求 压缩并转换为Base64String后,它被重定向到ADFS。带有SAML请求的URL如下所示 https://XXXX.YYYY.ZZZZ/adfs/ls/?SAMLRequest=hZHNbsIwEIRfJfLdsfODAhZEouVQJKpGJO2hl8okS7Ga2KnXoTx+A0KLuncjrflmz3Bnkju6fcvohfqwjta561xc/I

  • 我是okta的新手saml。单点登录集成成功,现在我想做单点注销。我在Okta做了以下工作- 1)单注销网址:http://localhost:8080/spring-security-saml2-sample/saml/logout 2) SP发行人:http://localhost:8080/spring-security-saml2-sample/saml/metadata 3) 创建证书并

  • 上下文:我正在研究SAML服务提供商实现。我们正在实施SAML Web SSO配置文件,其中包含用于生成AuthnRequest的HTTP-ReDirect绑定和用于接受Saml响应的HTTP-Post绑定(Dropbox for Business等流行产品使用的典型设置)。我们的SPendpoint将对网络上的任何人公开访问,我们的断言消费者服务URL是HTTPS。 SAML 规范非常明确地说明

  • > 。 有些帖子说x509是用来生成自签名证书的。 但使用时出错: 请告诉我哪条路是正确的。如果是正确的,如何解决错误?非常感激!

  • 我正在努力在使用Spring Security SAML扩展时实现单一注销功能。在这种情况下,当从另一个应用程序启动单个注销请求时,必须从身份提供程序(WSO2 身份服务器)向 Spring 安全 SAML 单一注销endpoint发送反向通道请求。问题在于发送到 spring 安全应用程序的反向通道注销请求的格式。我试图以以下[1]和[2]格式发送请求,但分别收到[3]和[4]作为响应。 请帮助

  • 作为服务提供商,我试图通过从身份提供商(IdP)获取SAML断言(SAML 1.0)来验证我页面上的用户。执行以下步骤(非常抽象): 用户访问我的页面 我将用户重定向到用户进行身份验证的IdP。 我得到了一个SAML工件,通过它我向IdP请求SAML断言。 IdP将SAML断言直接发送回我的页面。 ? 此过程是否足以确保用户身份验证是合法的?我是否只是在步骤 5 中授予用户对我服务的访问权限,还是