La validation de la Signature de l'élément XML échoue contre XSD

J'ai un fichier XML qui est de la validation par rapport à un schéma. Cependant, dans notre site web, nous utilisons un violon pour surveiller les requêtes qu'il fait et a remarqué beaucoup de demandes qui, je crois, sont liées à notre XML et XSD définition.

C'est tous les concernant mon désir d'utiliser Microsoft SignedXML objets pour ajouter une signature à mon XML que je suis de la génération de l'application. J'ai eu des problèmes d'obtention de cette signature pour valider et après un peu d'aide de commentaires ci-dessous réussi à le faire. Mais maintenant, ce problème se présente.

J'ai essayé de le valider dans Notepad++, mais tout ce que j'obtiens est "Impossible d'analyser un fichier de schéma d'erreur".

Mon XML est:

<?xml version="1.0" encoding="utf-8"?>
<EngineRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" EngineVersion="6.0" RequestTime="2012-01-07T12:46:15.31868+13:00" xmlns="analysis.org.nz">
  <Analysis xmlns="">
  ... Various elements here
  </Analysis>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <DigestValue>QDhgJy28UHmqhB2SA825mudXkr0=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>fVxTK70NBoDuMw/76Sxx8lH5bWrEDbx2w+RfB1pkuUCLpjafG06U1PptjM0ndHMFGxWBa7lhaqyQV3fQOQ/KFzyYdeijQRXdOsV39Ex0GBhM+Ajo5YCdm6XfQaLheoSGaAf5TX7H7+mxwiFd71VENxWDWKmnQEVA3nUaWRumHOM=</SignatureValue>
  </Signature>
</EngineRequest>

Mon XSD:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            
            xmlns:tns="analysis.org.nz"
            xmlns:ds="http://www.w3.org/2000/09/xmldsig#"            
            targetNamespace="analysis.org.nz"
            attributeFormDefault="unqualified"
            >

  <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.mywebsite.co.nz/xsd/xmldsig-core-schema.xsd"/>

  <xsd:complexType name="AnalysisType">
  ... Various elements etc here
  </xsd:complexType>
   <xsd:element name="EngineRequest">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Analysis" type="tns:AnalysisType" />
        <xsd:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
      </xsd:sequence>
      <xsd:attribute name="EngineVersion" type="xsd:string" />
      <xsd:attribute name="RequestTime"   type="xsd:dateTime" use="required"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema> 

Le Violoneux de sortie est:

www.mywebsite.co.nz/xsd/xmldsig-core-schema.xsd
www.w3.org/2001/XMLSchema.dtd
www.w3.org/2001/datatypes
www.mywebsite.co.nz/xsd/xmldsig-core-schema.xsd

Voici mon C# qui est en train de faire la validation de mon côté, je pense que c'provoquant la multiplication des demandes vu dans un violon:

public static bool Validate(String input)
    {
        _isValid = true; //set to false if any error occurs
        _message.Clear();

        StringReader xml = new StringReader(input);

        //load embedded schema resource to validate against
        Assembly assembly = Assembly.GetExecutingAssembly();

        //validation settings
        XmlReaderSettings settings = new XmlReaderSettings();            
        settings.ValidationType = ValidationType.Schema;

        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationEventHandler);

        //add schemas for validation
        AddSchema(assembly, settings);
        AddSignatureSchema(assembly, settings);

        //create xml validation reader            
        XmlReader reader = XmlReader.Create(xml, settings);

        //validation node by node
        while (reader.Read()) ;

        reader.Close();

        return IsValid;
    }

    private static void AddSchema(Assembly assembly, XmlReaderSettings settings)
    {
        Stream xsdStream = assembly.GetManifestResourceStream("Engine.Schema.Engine.xsd");
        XmlReader xsdReader = XmlReader.Create(xsdStream);

        settings.Schemas.Add("mywebsite.org.nz", xsdReader);
    }

    private static void AddSignatureSchema(Assembly assembly, XmlReaderSettings settings)
    {
        XmlReaderSettings sigSettings = new XmlReaderSettings()
        {
            ValidationType = ValidationType.DTD,
            DtdProcessing = DtdProcessing.Parse
        };

        Stream sigStream = assembly.GetManifestResourceStream("Engine.Schema.xmldsig-core-schema.xsd");
        XmlReader sigReader = XmlReader.Create(sigStream, sigSettings); 

        settings.Schemas.Add(null, sigReader); //signature schema

    }

Idéalement, je ne veux pas avoir à importer de la Signature de l'espace de noms comme cela, cependant, si je n'ai pas je n'ai pas accès à la Signature de l'élément. Quand j'ai essayé de créer mon propre Signature élément pour correspondre à la xmldsig-core-schéma de celui que j'ai eu des erreurs de validation en raison des directives de Microsoft SignedXML() de l'objet de la passation de la xmlns="http://www.w3.org/2000/09/xmldsig#" erreur dans le code XML généré.

REMARQUE: Cette question a été mis à jour à partir de son origine à cause des erreurs de changer un peu après j'ai fait des modifications à mon XML et XSD. Cependant mon problème est toujours présent dans ce que je fais de la difficulté à ajouter ce qui pouvait paraître une chose simple?

Pouvez-vous poster plus de votre XSD, il semble que vous n'avez pas de définition pour la Signature de l'élément. Avec ce qui est montré, il ressemble à une Demande ne peut avoir d'éléments enfants suivants: Analyse, EngineVersion, RequestTime. Aussi, est le vide balise de fermeture (</>) la partie de votre XML, ou est-ce juste une abréviation?
Grâce bakoyaro. Quand j'ajoute de la définition de l'en enlevant le commentaire, je reçois l'erreur SignatureType pas déclarée à partir de mon code c#. Je pense que je peut être nécessaire d'ajouter le XSD pour les Schémas.Add() qui contient le SignatureType déclaration?
Comment est SignatureType déclaré dans votre XSD? Je ne vois pas dans votre version diffusée.
J'ai ajouté la signature de l'élément à mon XSD mais je suis toujours la même erreur.

OriginalL'auteur dreza | 2011-12-22