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

时间:2015-03-05 16:45:19

标签: .net single-sign-on wif saml-2.0 claims-based-identity

请参阅此(精简版)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阅读器设置为仅发送SAML 2.0响应的<Assertion>段:

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

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

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

  

ID4152:无法验证Saml2SecurityToken,因为未设置IssuerToken属性。无符号SAML2:无法验证断言。

我是否正确理解,如果<Signature>仅存在于整个xml响应中,我就无法调用ValidateToken,而必须转而使用更为通用的功能,例如SignedXml.CheckSignature

1 个答案:

答案 0 :(得分:2)

好的,确实你正在解析真正的SAML2消息。 WIF不支持这一点。 WIF可能认为这是一个无符号断言。

我必须深入研究Reflector和/或参考源。 任何方式你都必须自己进行解析和验证。我个人不使用SignedXml。也许这是可能的。它有其他副作用。欢迎来到矿场。

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