2017-06-20 79 views
1

TL; DR:任何人都可以在验证过程中找到Saml2SecurityTokenHandler支持签名算法的权限?Saml2SecurityTokenHandler是否支持使用SHA256签名的SAML2声明?


我使用Saml2SecurityTokenHandler从我的IdP验证SAML断言。

仅供参考,我使用与签署SHA256样本断言发现here

<Assertion ID="_de9f29bd-52ca-4237-95c1-eb53f70fe8e5" IssueInstant="2012-11-06T00:45:30.593Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> 
<Issuer>ADatum</Issuer> 
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ds:SignedInfo> 
     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
     <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> 
     <ds:Reference URI="#_de9f29bd-52ca-4237-95c1-eb53f70fe8e5"> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> 
      <ds:DigestValue>+6OWUn1dFIUJQ6FQ25zgmZvg8zPzfcjnj4ujUvgfmEQ=</ds:DigestValue> 
     </ds:Reference> 
    </ds:SignedInfo> 
    <ds:SignatureValue>O85ytS9fcAhOk/0K25SndyBUbNLrx6J+tv+Uht+HZZ4CzsqjVBU1FpkXjDG03HqZ7xEu3+rMnsyxefDq6Xftw1E926QsG/oPM/afWfbR5dLucjsVaNzXCXzZu+jBmp5KkAv/vv1Es67KnPMr/RDeCVFy9eyxJka6dd8h8RTlatg=</ds:SignatureValue> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <X509Data> 
      <X509Certificate>MIICGjCCAYOgAwIBAgIQeJe5qR+4T6VJNZYtWjhErzANBgkqhkiG9w0BAQQFADAgMR4wHAYDVQQDExVBQ1MyQ2xpZW50Q2VydGlmaWNhdGUwHhcNMTExMDEwMDcwMDAwWhcNNDExMjMxMDcwMDAwWjAgMR4wHAYDVQQDExVBQ1MyQ2xpZW50Q2VydGlmaWNhdGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKjtrnJ+bduREosQ9+SH1ocI13wlxStLi8y5heGPo5UBcuf0hYRq4PvjwEY2twebP6iwxjwGqhu224UDUfPWMhQBOh+NFnv9GHAh+W4jFJxvTCcyXTkZRFqgAYRjMvyxzNeHVqn4AJ/ddKGf1fMVCuKhPYteHy2yNacXujucPP6/AgMBAAGjVTBTMFEGA1UdAQRKMEiAEFD3/7uhGcI2nSHZqB0bN66hIjAgMR4wHAYDVQQDExVBQ1MyQ2xpZW50Q2VydGlmaWNhdGWCEHiXuakfuE+lSTWWLVo4RK8wDQYJKoZIhvcNAQEEBQADgYEAkgxktVU5e8TVoigsDRm4qyw6gM/kie3e6dFM0T1BFoQV0PW9W9yKPiP72eTi+331tLFnwDxz5RJLABctAO71plwtREd0k3E0Jsju+Web+u8YcCD43aViQXgXRrY5ghDGwpFRcaNa1PnYY5nk3DYfyZZdz1L+fb30VDiugdf7dBI=</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
</ds:Signature> 
<Subject> 
    <NameID>ADatum</NameID> 
    <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" /> 
</Subject> 
<Conditions NotBefore="2012-11-06T00:45:31.905Z" NotOnOrAfter="9999-12-31T23:59:59.999Z"> 
    <AudienceRestriction> 
     <Audience>https://accesscontrol.adatum.com</Audience> 
    </AudienceRestriction> 
</Conditions> 
<AttributeStatement> 
    <Attribute Name="http://schemas.microsoft.com/spf/2012/03/claims/tenantname"> 
     <AttributeValue>Fabrikam</AttributeValue> 
    </Attribute> 
</AttributeStatement> 
<AttributeStatement> 
    <Attribute Name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role"> 
     <AttributeValue>SSU</AttributeValue> 
    </Attribute> 
</AttributeStatement> 
<AttributeStatement> 
    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"> 
     <AttributeValue>[email protected]</AttributeValue> 
    </Attribute> 
</AttributeStatement> 

我有以下代码试图验证这个签名

//All that matters now is to validate the token and get the claims 
var validationParameters = new TokenValidationParameters(); 
validationParameters.ValidIssuer = options.Issuer; 
validationParameters.ValidAudience = options.Audience; 
validationParameters.IssuerSigningToken = new X509SecurityToken(options.SigningCertificate); 
validationParameters.ValidateLifetime = validateLifetime; 
validationParameters.TokenReplayCache = options.ReplayRepository; 

EnsureCanonicalForm(response, assertion); 

SecurityTokenHandlerCollection coll = SecurityTokenHandlerCollectionExtensions.GetDefaultHandlers(); 
SecurityToken tokenOut; 
var retVal = coll.ValidateToken(assertion.OuterXml, validationParameters, out tokenOut); 

options.SigningCertificate是您可以在从开始的XML中看到证书3210。 assertion.OuterXml是上述XML的全部内容。

我期待SAML2SecurityTokenHandler处理SHA256,但是这个代码失败上ValidateToken()与错误

签名验证失败。

我知道代码适用于SHA1使用相同的代码与不同的断言示例。

我是不是能够找到的签名算法任何提及,无论是the handlerthe token itself周围的文档中,但对于XML签名散列至少one of the specs不会调用出SHA256。

任何人都可以找到这个类支持签名算法的权威来源吗?

+0

我可以调用SAML 2测试sha256 2 – Saravanan

+0

我可以确认SHA256在SAML2声明中不存在问题。我们在几个使用IdentityServer v2作为STS的项目中实现了它。 – pepo

回答

1

Saml2SecurityTokenHandler在验证签名时不能正确处理空格。在大多数情况下,这并不重要,因为断言很少印刷。但是这是一个。所以我想这就是问题所在。

对于我创建的SAML库,我们完全忽略了处理程序中的签名验证,并根据SignedXml而不是我们自己的方法来代替,这更可靠(尽管您需要记住自己检查参考)。

+0

漂亮打印将使几乎任何已签名的xml的签名无效,因为它会销毁原始文档(除非原始文档已经打印好)。你不能说出文档是什么样子,因为规范化方案没有考虑到空白。这是不是恕我直言,可能计算签署的文件的正确散列,因此不可能验证文档的完整性/签名。 – pepo

+0

*计算签名后的漂亮打印*使其无效。但是如果一个包含空格的XML文档(例如漂亮的打印文件)被签名,'Saml2SecurityTokenHandler'就会出现问题。 –

相关问题