【问题标题】:How To User XmlDsigEnvelopedSignatureTransform independent of SignedXml class如何使用独立于 SignedXml 类的 XmlDsigEnvelopedSignatureTransform
【发布时间】:2012-08-27 15:19:32
【问题描述】:

互联网上的所有examples 都显示了 XmlDsigEnvelopedSignatureTransform 类作为 SignedXml 类的一部分的用法。

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

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

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

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

【问题讨论】:

    标签: c# xml xml-signature xslt


    【解决方案1】:

    我自己也遇到了同样的问题。事实证明,如果您“按原样”使用 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;
    

    【讨论】:

      【解决方案2】:

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

      如果你只是想去掉这个元素,为什么不直接从列表中删除它呢?

      看看这个:

      How to remove an XmlNode from XmlNodeList

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 2016-08-09
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多