1

是 Microsoft使用SignedXml类验证签名的示例,由于在代码中将XmlNode转换为XmlElement,它对我不起作用(在 Visual Studio 2013 和 .NET 版本 4.0 中):

Boolean VerifyDetachedSignature( String^ XmlSigFileName )
{

   // Create a new XML document.
   XmlDocument^ xmlDocument = gcnew XmlDocument;

   // Load the passed XML file into the document.
   xmlDocument->Load( XmlSigFileName );

   // Create a new SignedXMl object.
   SignedXml^ signedXml = gcnew SignedXml;

   // Find the "Signature" node and create a new 
   // XmlNodeList object.
   XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( "Signature" );

   // Load the signature node.
   signedXml->LoadXml( safe_cast<XmlElement^>(nodeList->Item( 0 )) );

   // Check the signature and return the result. 
   return signedXml->CheckSignature();
}

“不起作用”是指即使我删除了引用的文件(那些在签名 XML文件中的引用中引用的文件),它也没有抛出任何异常。这意味着它只是没有检查它们。

但是当我以这种方式初始化signedXml时:

   SignedXml^ signedXml = gcnew SignedXml(xmlDococument);
   signedXml->LoadXml(xmlDococument->DocumentElement);

   //xmlDococument->DocumentElement is an XmlElement

它在找不到引用文件时抛出异常并在找到所有引用文件时返回“真实”值(因为签名是正确的)完美地工作。

这意味着在将 XmlNode 转换为 XmlElement 时会发生错误,即使(即使它确实返回了我需要的节点)。我什至尝试用 XmlWriter 编写它并得到了我需要的东西。

问题是我需要将XmlNode 转换为 XmlElement的方式,因为我正在使用的 XML 文件在树的下方有一个Signature元素(也就是说,它不是根节点),我需要使用SelectSingleNodeGetItemByTagName . 我该如何解决这个问题?

4

0 回答 0