Проблема проверки XML-схемы "Безопасность"

У меня есть следующий xsd:

<xsd:schema
    targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    elementFormDefault="qualified" attributeFormDefault="unqualified"
    blockDefault="#all" version="0.2">
    <xsd:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  schemaLocation="../MSG/IRS-WSTimeStampElementMessage.xsd" />
    <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="../MSG/IRS-WSSignatureElementMessage.xsd"/>
    <xsd:complexType name="SecurityHeaderType">
        <xsd:annotation>
            <xsd:documentation>This complexType defines header block to use for
                security-relevant data directed at a specific SOAP actor.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element ref="ds:Signature" minOccurs="0"/>
            <xsd:element ref="wsu:Timestamp" minOccurs="0"/>            
        </xsd:sequence>
        <xsd:anyAttribute namespace="##other" processContents="lax" />
    </xsd:complexType>
    <xsd:element name="Security" type="wsse:SecurityHeaderType">
        <xsd:annotation>
            <xsd:documentation>This element defines the wsse:Security SOAP header
                element per Section 4.</xsd:documentation>
        </xsd:annotation>
    </xsd:element>
</xsd:schema>

И это XML, который я пытаюсь проверить по приведенной выше схеме:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <u:Timestamp u:Id="TS-E68EBBF1696C5DD4AA143353323390073">
                <u:Created>2016-03-22T12:42:44.170Z</u:Created>
                <u:Expires>2016-03-22T12:52:44.170Z</u:Expires>
            </u:Timestamp>
            <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#WithComments" />
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                    <ds:Reference URI="#id-1">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>2gAU0kJV40nvR+Og=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#id-2">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>pISNeszVQ59HKCRbQ=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#TS-E68EBBF1696C5DD4AA143353323390073">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>mh7+cJJPRtrrn/s4N15AE=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>fhpY2IlKEdwBFWqNxbVEw7p+ojhw54+op+g==</ds:SignatureValue>
                <ds:KeyInfo>
                    <ds:X509Data>fshPnGE6H36KNqWMZqTf+X0oBls3dLz7TY=</ds:X509Certificate>
                    </ds:X509Data>
                </ds:KeyInfo>
            </ds:Signature>
</wsse:Security>

Чего я не мог понять, так это почему во время проверки я получаю следующую ошибку:

ERROR: The element 'Security' in namespace 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' has invalid child element 'Signature' in namespace 'http://www.w3.org/2000/09/xmldsig#'.

Это похоже на элемент, определенный в пространстве имен, но валидатор, кажется, не обращает на это внимания или просто игнорирует этот факт по какой-то причине.


person fatherOfWine    schedule 22.03.2016    source источник


Ответы (2)


Они появляются в неправильном порядке. Последовательность должна отображаться в том порядке, в котором она объявлена. У вас есть минимальное вхождение 0, установленное для подписи, поэтому это не вызвало у вас проблемы с отметкой времени, которая была первой.

если вы не хотите применять порядок появления ваших дочерних элементов, тогда вы используете xsd::all, но у него есть свои проблемы/правила Разница между ‹xsd:all› и ‹xsd:sequence› в определении схемы?

person Rob    schedule 22.03.2016
comment
Большое спасибо! Последовательность БЫЛА проблемой! Ценю твою помощь! - person fatherOfWine; 22.03.2016
comment
Всегда рад помочь. - person Rob; 24.03.2016

Чтобы расширить то, что сказал @Rob.

Когда я создал свой элемент Signature, после использования метода ComputeSignature() объекта SignedXml я использовал метод signedXml.GetXml() для вывода XML в объект XmlElement. Использовал это для хранения цифровой подписи. Я создал объект XmlNode для хранения ссылки на элемент Security, а затем использовал метод InsertBefore для добавления цифровой подписи перед FirstChild элемента Security.

Это поместит дочерние элементы элемента Security в соответствующий порядок.

// Compute the signature.
xSigned.ComputeSignature();

// Get the Xml representation of the signature and save it to an XmlElement object.
XmlElement xmlDigitalSignature = xSigned.GetXml();

// Replace the KeyInfo element of the DigitalSignature with the appropriate KeyInfo information.
xmlDigitalSignature = ReplaceKeyInfo(xmlDigitalSignature);

// Create a reference to the Security Element under the SOAP Header.
XmlNode securityNode = xdoc.DocumentElement.SelectSingleNode("//soapenv:Header/wsse:Security", XmlManager(xdoc));

// Add the element to the XmlDocument by moving the Signature Element to be the first child under the Security Element.
securityNode.InsertBefore(xdoc.ImportNode(xmlDigitalSignature, true), securityNode.FirstChild);
person Russ    schedule 23.03.2016
comment
Спасибо чувак! Уже делаю это, но тем не менее безрезультатно: все еще получаю печально известную ошибку. Перечитал их руководство еще раз и пришел к выводу: его надо называть правильнее: заблуждение :( - person fatherOfWine; 24.03.2016
comment
@fatherOfWine у ​​вас получилось сработать? - person Russ; 30.03.2016
comment
Да, я сделал. Я оставил вам обновленную информацию по вашему вопросу. Вы видели это? - person fatherOfWine; 30.03.2016
comment
Спасибо, теперь я это вижу. К сожалению, я считаю, что у меня есть все правильные и подходящие поля в документе Form1094C/1095C в соответствии с их схемами. - person Russ; 30.03.2016
comment
Жаль это слышать. Я оставил вам еще одно обновление. С кратким описанием моего решения и упоминанием дополнительных изменений, которые я внес, чтобы изменить ситуацию. - person fatherOfWine; 30.03.2016
comment
@fatherOfWine Я ответил в этой теме. Похоже, вы делаете что-то не так, как я. - person Russ; 31.03.2016