WIF Saml2SecurityTokenHandler 可以验证顶级签名吗?

Can WIF Saml2SecurityTokenHandler validate top-level signature?

查看此(精简版)SAML 2.0 响应:

<samlp:Response>
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">lkasjdflkasj</saml:Issuer>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <!--<snip>-->
  </Signature>
  <samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
  </samlp:Status>
  <saml:Assertion>
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">lkasjdflkasj</saml:Issuer>
    <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">jsmith</saml:NameID>
      <!--<snip>-->
    </saml:Subject>
    <!--<snip, but there was NOT a Signature node inside the assertion>-->
  </saml:Assertion>
</samlp:Response>

在下面的代码中,xml reader 设置为仅发送 SAML 2.0 响应的 <Assertion> 部分:

var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;
var token = handlers.ReadToken( myXmlReader );
var identities = handlers.ValidateToken( token );

如果 <Signature> 节点是断言的一部分,那么 ValidateToken() 将使用配置设置验证它,例如issuerNameRegistry 中的示例)。

但是如果签名处于更高级别(即整个 xml 被签名,而不仅仅是断言),那么我们将得到一个异常,如:

ID4152: The Saml2SecurityToken cannot be validated because the IssuerToken property is not set. Unsigned SAML2:Assertions cannot be validated.

我是否理解正确,如果 <Signature> 仅存在于总体 xml 响应中,我不能调用 ValidateToken,而是必须恢复到更通用的功能,例如SignedXml.CheckSignature?

好的,您确实在解析真正的 SAML2 消息。 WIF 不支持。 WIF 可能认为这是一个未签名的断言。

我将不得不深入研究 Reflector and/or 参考源。 您必须自己进行解析和验证的任何方式。而且我个人不使用 SignedXml。也许这是可能的。它还有其他副作用。欢迎来到雷区

著名参考文章:https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf

创建 Saml2SecurityTokenHandler 的子类并覆盖 TryResolveIssuerToken 方法。如果您在前面的步骤中验证了签名,此方法可以为签名证书提供 thumbs-up,否则它不会知道。

我现在在生产代码中使用了这种方法。