在 SAML Response 中,我们应该签署 Response 还是 Assertion

In SAML Response should we sign Response or Assertion

将 SAML 响应返回给 SP 时,大多数 IdP(如 AzureAD、Okta、Onelogin、GSuite)具有以下有关签名的选项:

并且在没有任何配置的情况下,对于大多数 IdP,签名的默认设置是仅签署断言。

下面是来自 AzureAD 的 SAML 响应示例(默认签名选项是签名断言)。断言受到完整性保护,无法进行篡改。但是Assertion以外的字段,DestinationInResponseToIssuer可以被篡改,或者add/remove不知情!

所以我的问题是:

  1. 为什么有3种签名方式? (响应、断言、响应和断言)
  2. 在哪个用例中我们应该选择签署整个响应、签署断言或同时签署响应和断言?
  3. 通过仅签署断言(大多数 IdP 的默认设置),我们是否暴露于任何漏洞?

由于断言是 SAML 响应的一部分,因此仅对 SAML 响应进行签名就足够了。这样您就可以 secure/sign 整个 SAML 身份验证响应。

通过签署断言,您只签署响应中的属性声明。

通过仅签署断言,我认为我们不会暴露任何漏洞,因为重要信息在 SAML 响应的断言中。

大多数 IDP 都有配置选项来根据 SP.Also 中的要求处理签名,如果您要构建自己的 IDP,则可以实现它以支持

勾选Scott's answer from the SOF post

The only requirement for the IdP following the SAML 2.0 spec is to digitally sign the Assertion (see http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf section 4.1.3.5). That is enough to tell if the SSO operation from an IdP should be trusted by SP that has federated with it.

Signing the outer Response is optional. There are some security benefits to it, such as preventing Message Insertion or Modification (see sections 6.1.3/6.1.5 in http://docs.oasis-open.org/security/saml/v2.0/saml-sec-consider-2.0-os.pdf) - but in practice it's often omitted in lieu of relying on SSL/TLS.