Как использовать XmlDsigEnvelopedSignatureTransform независимо от класса SignedXml

Все примеры в Интернете показывают использование класса XmlDsigEnvelopedSignatureTransform как часть класса SignedXml.

Я хотел бы использовать этот класс сам по себе. Просто дайте ему nodeList, чтобы получить результат без узла подписи.

XmlDsigEnvelopedSignatureTransform envSigTrans = new XmlDsigEnvelopedSignatureTransform();
envSigTrans.LoadInput(xmlDocument.DocumentElement.SelectNodes("//*"));
XmlNodeList nodeList = (XmlNodeList)envSigTrans.GetOutput(typeof(XmlNodeList));

Но выходной список узлов по-прежнему содержит узел ds:Signature, от которого я хотел бы избавиться.

Каков правильный способ сделать это? Ваша помощь очень ценится.


person artsince    schedule 27.08.2012    source источник


Ответы (2)


Только что сам столкнулся с той же проблемой. Оказывается, если вы используете XmlDsigEnvelopedSignatureTransform «как есть», вы всегда получите все узлы обратно. Я отследил XmlDsigEnvelopedSignatureTransform в рефлекторе, и он удалит подпись, только если она имеет значение в _signaturePosition. Это частный API, который только MS использует внутренне (от SignedInfo), поэтому большой XmlDsigEnvelopedSignatureTransform бесполезен как пользователь. Хорошей новостью является то, что вы можете установить его вручную через приватное отражение. Если ваш Xml содержит только один элемент подписи, значение всегда должно быть равно единице.

    var transform = new XmlDsigEnvelopedSignatureTransform(false);
    transform.LoadInput(xmldoc);        
    FieldInfo field = transform.GetType().GetField("_signaturePosition", 
                     BindingFlags.NonPublic |
                     BindingFlags.Instance);
    field.SetValue(transform, 1);                
    var res = (XmlDocument)t.GetOutput();
    var str = res.OuterXml;
person Yaron Naveh    schedule 22.06.2013

«Но выходной список узлов по-прежнему содержит узел ds:Signature, от которого я хотел бы избавиться».

Если вы просто хотите избавиться от элемента, почему бы вам просто не удалить его из списка?

Посмотри на это:

Как удалить XmlNode из XmlNodeList

person gnumaru    schedule 16.05.2013