0

Internet 上的所有示例都显示了 XmlDsigEnvelopedSignatureTransform 类作为 SignedXml 类的一部分的用法。

我想自己使用这个类。只需给它一个 nodeList 就可以得到没有签名节点的结果。

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

但是输出 nodeList 仍然包含我想摆脱的 ds:Signature 节点。

这样做的正确方法是什么?非常感谢您的帮助。

4

2 回答 2

4

我自己也遇到了同样的问题。事实证明,如果您“按原样”使用 XmlDsigEnvelopedSignatureTransform,您将始终恢复所有节点。我已经在反射器中找到了 XmlDsigEnvelopedSignatureTransform,如果签名在 _signaturePosition 中有值,它只会删除签名。这是一个私有 API,尽管只有 MS 在国际上使用(通过 SignedInfo),所以大型 XmlDsigEnvelopedSignatureTransform 对用户没有用处。好消息是您可以通过私有反射手动设置它。如果您的 Xml 中只有一个签名元素,则该值应始终为 1。

    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;
于 2013-06-22T17:28:51.450 回答
0

“但输出 nodeList 仍然包含我想摆脱的 ds:Signature 节点。”

如果您只是想摆脱该元素,为什么不将其从列表中删除呢?

看看这个:

如何从 XmlNodeList 中删除 XmlNode

于 2013-05-16T17:55:46.937 回答