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?
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
Vous devez vous connecter pour publier un commentaire.
Vous avez un couple de problèmes ici:
Le XSD dit que
OriginalL'auteur David W
Le problème semble être lié à la AddSignatureSchema() la méthode. C'était à l'origine un téléchargement de la DTD situé dans http://www.mywebsite.co.nz/xsd/xmldsig-core-schema.xsd le à chaque fois qu'il a été appelé.
Tout ce que j'avais à faire était de définir la XMLResolver à null, ce qui a empêché le téléchargement de produit. J'ai trouvé ça d'une autre question à la Prévenir la DTD de téléchargement lors de l'analyse xml
J'ai également réglé le DtdProcessing = DtdProcessing.Ignorer un drapeau. La méthode ressemble à
Est-ce que votre déclaration d'élément de permettre minOccurs=0? Difficile de savoir sans plus d'informations, désolé. Peut-être peut-être plus facile de créer un nouveau sujet avec votre xml et xsd déclarations et le message d'erreur survenant?
Mon collègue a posté la question. Veuillez voir le lien stackoverflow.com/questions/10779764/...
OriginalL'auteur dreza