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,否则它不会知道。
我现在在生产代码中使用了这种方法。
查看此(精简版)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,否则它不会知道。
我现在在生产代码中使用了这种方法。