Как использовать XmlDsigEnvelopedSignatureTransform независимо от класса SignedXml
Во всех примерах в Интернете показано использование класса XmlDsigEnvelopedSignatureTransform как части класса SignedXml.
Я хотел бы использовать этот класс сам по себе. Просто дайте ему nodeList получить результат без узла подписи.
XmlDsigEnvelopedSignatureTransform envSigTrans = new XmlDsigEnvelopedSignatureTransform();
envSigTrans.LoadInput(xmlDocument.DocumentElement.SelectNodes("//*"));
XmlNodeList nodeList = (XmlNodeList)envSigTrans.GetOutput(typeof(XmlNodeList));
Но выходной nodeList по-прежнему содержит узел ds:Signature, от которого я хотел бы избавиться.
Как правильно это сделать? Ваша помощь очень ценится.
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;
"Но выходной файл nodeList по-прежнему содержит узел ds:Signature, от которого я хотел бы избавиться".
Если вы просто хотите избавиться от элемента, почему бы вам просто не удалить его из списка?
Посмотри на это: