2010-12-02 39 views
0

Nous avons développé une petite méthode qui extrait une clé cryptographique à partir d'un document XML signé, puis vérifie la signature à l'aide de la méthode SignedXml.CheckSignature.Cryptographic Licensing Module ne fonctionne pas à partir du site Web?

Lorsqu'elle est exécutée à partir d'une application de ligne de commande, la clé valide correctement. Cependant, dès que je l'appelle à partir d'une application Web, il cesse de fonctionner. Tout le monde sait ce qui pourrait arriver ?:

// Verify the signature of an XML file against an asymmetric 
    // algorithm and return the result.XmlDocument Doc, RSA Key 
    public static Boolean VerifyLicenceFile(string xmlLicFilePathArg) 
    { 
     bool isVerified = false; 

     try 
     { 

      CspParameters cspParams = new CspParameters(); 
      cspParams.KeyContainerName = containerName; 

      RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams); 

      // Create a new XML document. 
      XmlDocument xmlDoc = new XmlDocument(); 

      // Load an XML file into the XmlDocument object. 
      xmlDoc.PreserveWhitespace = true; 
      xmlDoc.Load(xmlLicFilePathArg); 


      // Check arguments. 
      if (xmlDoc == null) 
       throw new ArgumentException("Doc"); 
      if (rsaKey == null) 
       throw new ArgumentException("Key"); 

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

      // Find the "Signature" node and create a new 
      // XmlNodeList object. 
      XmlNodeList nodeList = xmlDoc.GetElementsByTagName("Signature"); 

      // Throw an exception if no signature was found. 
      if (nodeList.Count <= 0) 
      { 
       throw new CryptographicException("Verification failed: No Signature was found in the document."); 
      } 

      // This example only supports one signature for 
      // the entire XML document. Throw an exception 
      // if more than one signature was found. 
      if (nodeList.Count >= 2) 
      { 
       throw new CryptographicException("Verification failed: More that one signature was found for the document."); 
      } 

      // Load the first <signature> node. 
      signedXml.LoadXml((XmlElement)nodeList[0]); 

      // Check the signature and return the result. 
      isVerified = signedXml.CheckSignature(rsaKey); 
     } 
     catch (Exception ex) 
     { 
     } 

     return isVerified; 

    } 
+0

OK, quelle est l'erreur? Qu'est-ce que 'arrête de travailler' veut dire? D'où viennent les pathArgs? –

+0

Salut désolé, j'aurais dû être plus explicite. 'Arrête de travailler' signifie que la valeur isVerified est juste fausse. Il n'y a pas d'erreur et je ne vois pas de différence dans ce qui se passe. Je ne peux pas réellement entrer dans l'une des classes C# (évidemment) donc pas sûr. Le pathArg est le chemin vers un fichier de licence qui existe définitivement et qui fonctionne définitivement lorsqu'il est appelé depuis une ligne de commande .... – Exitos

+0

Les applications Consaole et ASP s'exécutent-elles sur le même PC? –

Répondre

1

Je suppose que le serveur Web fonctionne comme un autre utilisateur que l'outil de ligne de commande. À moins que vous n'utilisiez le CspProviderFlags.UseMachineKeyStore, le CspParameters utilisera par défaut le magasin de clés de l'utilisateur. RsaCryptoServiceProvider génère silencieusement une nouvelle clé si le conteneur de clés spécifié n'existe pas, de sorte que votre code utilise une clé différente pour vérifier lors de l'exécution dans le serveur Web que lors de l'exécution à partir de la ligne de commande.

+0

Salut, essayé cela et cela ne fonctionne pas malheureusement :-( – Exitos

+0

@ Pete2k: Vous devez vous assurer que la clé qui signe les données est la même que Pour être complètement sûr, vous pouvez vous connecter à rsaKey.ToXmlString (false) .Sauf les chaînes sont identiques lors de la signature et la vérification que vous n'utilisez pas la même clé –

+0

ok je vais essayer et vous faire savoir – Exitos