none
Agregar al encabezado RRS feed

  • Pregunta

  • Necesito agregar lo siguiente a mi encabezado xml

    <xs:schema xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" elementFormDefault="qualified" attributeFormDefault="unqualified" version="4.2" vc:minVersion="1.1">
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/xmldsig-core-schema.xsd"/>
    </xs:schema>

    de momento me aparece solo la etiqueta de abertura. Alguien me podria ayudar?

    martes, 14 de noviembre de 2017 23:12

Respuestas

  • Gracias, ya entiendo que es lo que pasa, la firma del XML es distinta. En el XSD que me dan como referencia es asi:

    <xs:schema xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" 
               xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    		   xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    		   xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
    		   targetNamespace="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" 
    		   elementFormDefault="qualified" 
    		   attributeFormDefault="unqualified" 
    		   version="4.2" 
    		   vc:minVersion="1.1"> 

    de momento la firma queda asi:

    <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>CybYdBmXudx9F0eulefbIX6OUIY=</DigestValue>
    		</Reference>
    	</SignedInfo>
    	<SignatureValue>cQeyoZkO5hObecGQWrK5tmI/Iq5HILZLIyX8CfY5iswx7IMfLY3ahVgvTenqF3H4+OtjPb1Rv1VebuE+0pLNy/5cn2LO7YpDQDzFDSC6p+Of7tpqkZBP0w1lQD5xO8REg0Ymlv9UA175vthxCSrdVh7uePBxuyVwbmEo6eiw1B0=</SignatureValue>
    </Signature>

    El proceso para generar la firma es el siguiente:

    try
                    {
                        // Create a new CspParameters object to specify a key container.
                        CspParameters cspParams = new CspParameters();
                        cspParams.KeyContainerName = "010945029010.p12";
    
                        //XML_DSIG_RSA_KEY
    
                        // Create a new RSA signing key and save it in the container. 
                        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(strRuta);
    
                        // Sign the XML document. 
                        SignXml(xmlDoc, rsaKey);
    
                        // Save the document.
                        xmlDoc.Save(strRuta);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
            public static void SignXml(XmlDocument xmlDoc, RSA Key)
            {
                // Check arguments.
                if (xmlDoc == null)
                    throw new ArgumentException("xmlDoc");
                if (Key == null)
                    throw new ArgumentException("Key");
    
                // Create a SignedXml object.
                SignedXml signedXml = new SignedXml(xmlDoc);
    
                // Add the key to the SignedXml document.
                signedXml.SigningKey = Key;
    
                // Create a reference to be signed.
                Reference reference = new Reference();
                reference.Uri = "";
    
                // Add an enveloped transformation to the reference.
                XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                reference.AddTransform(env);
    
                // Add the reference to the SignedXml object.
                signedXml.AddReference(reference);
    
                // Compute the signature.
                signedXml.ComputeSignature();
    
                // Get the XML representation of the signature and save
                // it to an XmlElement object.
                XmlElement xmlDigitalSignature = signedXml.GetXml();
    
                // Append the element to the XML document.
                xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
            }
    
    

    Se puede editar este proceso para que sea igual al del XSD.




    miércoles, 15 de noviembre de 2017 16:03

Todas las respuestas

  • hola

    pero ese no es un xml, es un schema, el cual se utiliza para validar el formato del xml

    eso no se agrega como encabezado, sino que se usa para validar

    si te animas usa linq xml

    How to: Validate Using XSD (LINQ to XML)

    veras en el ejemplo como lo aplica para validar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de noviembre de 2017 12:42
  • Gracias, ya entiendo que es lo que pasa, la firma del XML es distinta. En el XSD que me dan como referencia es asi:

    <xs:schema xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" 
               xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    		   xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    		   xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
    		   targetNamespace="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" 
    		   elementFormDefault="qualified" 
    		   attributeFormDefault="unqualified" 
    		   version="4.2" 
    		   vc:minVersion="1.1"> 

    de momento la firma queda asi:

    <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>CybYdBmXudx9F0eulefbIX6OUIY=</DigestValue>
    		</Reference>
    	</SignedInfo>
    	<SignatureValue>cQeyoZkO5hObecGQWrK5tmI/Iq5HILZLIyX8CfY5iswx7IMfLY3ahVgvTenqF3H4+OtjPb1Rv1VebuE+0pLNy/5cn2LO7YpDQDzFDSC6p+Of7tpqkZBP0w1lQD5xO8REg0Ymlv9UA175vthxCSrdVh7uePBxuyVwbmEo6eiw1B0=</SignatureValue>
    </Signature>

    El proceso para generar la firma es el siguiente:

    try
                    {
                        // Create a new CspParameters object to specify a key container.
                        CspParameters cspParams = new CspParameters();
                        cspParams.KeyContainerName = "010945029010.p12";
    
                        //XML_DSIG_RSA_KEY
    
                        // Create a new RSA signing key and save it in the container. 
                        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(strRuta);
    
                        // Sign the XML document. 
                        SignXml(xmlDoc, rsaKey);
    
                        // Save the document.
                        xmlDoc.Save(strRuta);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
            public static void SignXml(XmlDocument xmlDoc, RSA Key)
            {
                // Check arguments.
                if (xmlDoc == null)
                    throw new ArgumentException("xmlDoc");
                if (Key == null)
                    throw new ArgumentException("Key");
    
                // Create a SignedXml object.
                SignedXml signedXml = new SignedXml(xmlDoc);
    
                // Add the key to the SignedXml document.
                signedXml.SigningKey = Key;
    
                // Create a reference to be signed.
                Reference reference = new Reference();
                reference.Uri = "";
    
                // Add an enveloped transformation to the reference.
                XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                reference.AddTransform(env);
    
                // Add the reference to the SignedXml object.
                signedXml.AddReference(reference);
    
                // Compute the signature.
                signedXml.ComputeSignature();
    
                // Get the XML representation of the signature and save
                // it to an XmlElement object.
                XmlElement xmlDigitalSignature = signedXml.GetXml();
    
                // Append the element to the XML document.
                xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
            }
    
    

    Se puede editar este proceso para que sea igual al del XSD.




    miércoles, 15 de noviembre de 2017 16:03
  • Hola  aus2302

    Con base a tu consulta, te recomiendo implementar el siguiente código, que te será de mucha utilidad.

    //Código en C# para implementar encabezado en XMl

    <%@ WebService Language="C#" Class="MyWebService" %>
    using System.Web.Services;
    using System.Web.Services.Protocols;

    // Define a SOAP header by deriving from the SoapHeader class.
    public class MyHeader : SoapHeader
    {
       public DateTime Created;
       public long Expires;
    }

    [WebService(Namespace="http://www.contoso.com")]
    public class MyWebService
    {
        // Add a member variable of the type deriving from SoapHeader.
        public MyHeader myHeaderMemberVariable;

        // Apply a SoapHeader attribute.
        [WebMethod]
        [SoapHeader("myHeaderMemberVariable")]
        public void MyWebMethod()
        {
            // Process the SoapHeader.
            if (myHeaderMemberVariable.Username == "admin")
            {
               // Do something interesting.
            }
        }
    }

    /*-----------------------código en XML -------*/

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Header>
        <MyHeader xmlns="http://www.contoso.com">
          <Created>dateTime</Created>
          <Expires>long</Expires>
        </MyHeader>
      </soap:Header>
      <soap:Body>
        <MyWebMethod xmlns="http://www.contoso.com" />
      </soap:Body>
    </soap:Envelope>

    Quedamos al pendiente de cualquier actualización de tu parte.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
    _____
     
    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
     
    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
     
    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 17 de noviembre de 2017 19:37
    Moderador