这是 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元素(也就是说,它不是根节点),我需要使用SelectSingleNode或GetItemByTagName . 我该如何解决这个问题?