2009-09-17 6 views
6

Comment puis-je valider dans .Net C# une signature SAML créée en Java? Voici la signature SAML que je reçois de Java:Valider la signature java SAML à partir de C#

<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:CanonicalizationMethod> 
     <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"> 
     </ds:SignatureMethod> 
     <ds:Reference URI="#_e8bcba9d1c76d128938bddd5ae8c68e1"> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"> 
       </ds:Transform> 
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
        <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="code ds kind rw saml samlp typens #default xsd xsi"> 
        </ec:InclusiveNamespaces> 
       </ds:Transform> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"> 
      </ds:DigestMethod> 
      <ds:DigestValue>zEL7mB0Wkl+LtjMViO1imbucXiE=</ds:DigestValue> 
     </ds:Reference> 
    </ds:SignedInfo> 
    <ds:SignatureValue> 
jpIX3WbX9SCFnqrpDyLj4TeJN5DGIvlEH+o/mb9M01VGdgFRLtfHqIm16BloApUPg2dDafmc9DwL 
Pyvs3TJ/hi0Q8f0ucaKdIuw+gBGxWFMcj/U68ZuLiv7U+Qe7i4ZA33rWPorkE82yfMacGf6ropPt 
v73mC0bpBP1ubo5qbM4= 
    </ds:SignatureValue> 
    <ds:KeyInfo> 
     <ds:X509Data> 
      <ds:X509Certificate> 
MIIDBDCCAeygAwIBAgIIC/ktBs1lgYcwDQYJKoZIhvcNAQEFBQAwNzERMA8GA1UEAwwIQWRtaW5D 
QTExFTATBgNVBAoMDEVKQkNBIFNhbXBsZTELMAkGA1UEBhMCU0UwHhcNMDkwMjIzMTAwMzEzWhcN 
MTgxMDE1MDkyNTQyWjBaMRQwEgYDVQQDDAsxMC41NS40MC42MTEbMBkGA1UECwwST24gRGVtYW5k 
IFBsYXRmb3JtMRIwEAYDVQQLDAlPbiBEZW1hbmQxETAPBgNVBAsMCFNvZnR3YXJlMIGfMA0GCSqG 
SIb3DQEBAQUAA4GNADCBiQKBgQCk5EqiedxA6WEE9N2vegSCqleFpXMfGplkrcPOdXTRLLOuRgQJ 
LEsOaqspDFoqk7yJgr7kaQROjB9OicSH7Hhsu7HbdD6N3ntwQYoeNZ8nvLSSx4jz21zvswxAqw1p 
DoGl3J6hks5owL4eYs2yRHvqgqXyZoxCccYwc4fYzMi42wIDAQABo3UwczAdBgNVHQ4EFgQUkrpk 
yryZToKXOXuiU2hNsKXLbyIwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSiviFUK7DUsjvByMfK 
g+pm4b2s7DAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEF 
BQADggEBAKb94tnK2obEyvw8ZJ87u7gvkMxIezpBi/SqXTEBK1by0NHs8VJmdDN9+aOvC5np4fOL 
fFcRH++n6fvemEGgIkK3pOmNL5WiPpbWxrx55Yqwnr6eLsbdATALE4cgyZWHl/E0uVO2Ixlqeygw 
XTfg450cCWj4yfPTVZ73raKaDTWZK/Tnt7+ulm8xN+YWUIIbtW3KBQbGomqOzpftALyIKLVtBq7L 
J0hgsKGHNUnssWj5dt3bYrHgzaWLlpW3ikdRd67Nf0c1zOEgKHNEozrtRKiLLy+3bIiFk0CHImac 
1zeqLlhjrG3OmIsIjxc1Vbc0+E+z6Unco474oSGf+D1DO+Y= 

      </ds:X509Certificate> 
     </ds:X509Data> 
    </ds:KeyInfo> 
</ds:Signature> 

Je sais pour analyser SAML, je dois valider la signature. Je essayé ceci:

public bool VerifySignature() 
{ 
    X509Certificate2 certificate = null; 

    XmlDocument doc = new XmlDocument(); 
    XmlElement xmlAssertionElement = this.GetXml(doc); 
    doc.AppendChild(xmlAssertionElement); 

    // Create a new SignedXml object and pass it 
    // the XML document class. 
    SamlSignedXml signedXml = new SamlSignedXml(xmlAssertionElement); 

    // Get signature 
    XmlElement xmlSignature = this.Signature; 
    if (xmlSignature == null) 
    { 
     return false; 
    } 

    // Load the signature node. 
    signedXml.LoadXml(xmlSignature); 

    // Get the certificate used to sign the assertion if information about this 
    // certificate is available in the signature of the assertion. 
    foreach (KeyInfoClause clause in signedXml.KeyInfo) 
    { 
     if (clause is KeyInfoX509Data) 
     { 
      if (((KeyInfoX509Data)clause).Certificates.Count > 0) 
      { 
       certificate = (X509Certificate2)((KeyInfoX509Data)clause).Certificates[0]; 
      } 
     } 
    } 

    if (certificate == null) 
    { 
     return false; 
    } 

    return signedXml.CheckSignature(certificate, true); 
    } 

Il valide la signature d'un SAML signé en .Net, mais pas de cette Java un.

Répondre

5

a résolu le problème avec les réponses sur ce sujet: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/faf0b66c-294b-4d84-a19b-504dd8e81922 Mon code est très similaire avec des exemples de MSDN représentés là, seule chose qui manquait était: doc.PreserveWhitespace = true sur la validation.

+0

Merci, Adrya, cette correction "PreserveWhitespace" a également résolu mon problème. L'article que j'ai utilisé, qui était lié à partir de votre lien, était: http://msdn.microsoft.com/en-us/library/ms229950.aspx –

0

Vous pouvez utiliser les classes de l'espace de noms System.Security.Cryptography.Xml pour vérifier les données XML signées avec une signature numérique, tant que vous avez la clé publique dans votre magasin de certificats. J'ai travaillé avec AD Federation Services qui utilise aussi SAML et si je me souviens bien, après avoir trouvé l'espace de noms dont j'avais besoin, le reste était assez simple - mais il y a assez longtemps que les détails m'échappaient.

Questions connexes