请参阅此(精简版)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?
答案 0 :(得分:2)
好的,确实你正在解析真正的SAML2消息。 WIF不支持这一点。 WIF可能认为这是一个无符号断言。
我必须深入研究Reflector和/或参考源。 任何方式你都必须自己进行解析和验证。我个人不使用SignedXml。也许这是可能的。它有其他副作用。欢迎来到矿场。
着名参考文章:https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf