23

名前空間プレフィックスがある場合、Id 属性で要素に署名できません:

void Main()
{
    var doc = new XmlDocument();
    doc.LoadXml("<root xmlns:u=\"myuri\"><test u:Id=\"_0\">Zebra</test></root>");

    SignedXml signedXml = new SignedXml(doc);
    signedXml.SigningKey = new RSACryptoServiceProvider();

    Reference reference = new Reference("#_0");
    signedXml.AddReference(reference);

    signedXml.ComputeSignature();
}

ComputeSignature()ここで「Malformed Reference Element」で失敗します。これはどのように行うべきですか?

4

4 に答える 4

51

私たちが使用したアプローチは、System.Security.Cryptography.Xml.SignedXmlクラスをサブクラス化することでした...

public class SignedXmlWithId : SignedXml
{
    public SignedXmlWithId(XmlDocument xml) : base(xml)
    {
    }

    public SignedXmlWithId(XmlElement xmlElement) 
        : base(xmlElement)
    {       
    }

    public override XmlElement GetIdElement(XmlDocument doc, string id)
    {
        // check to see if it's a standard ID reference
        XmlElement idElem = base.GetIdElement(doc, id);

        if (idElem == null)
        {
            XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
            nsManager.AddNamespace("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

            idElem = doc.SelectSingleNode("//*[@wsu:Id=\"" + id + "\"]", nsManager) as XmlElement;
        }

        return idElem;
    }
}
于 2011-06-24T12:35:14.113 に答える
3

var 参照 = 新しい参照 (""); // これはドキュメント全体に署名します

于 2011-02-24T01:20:55.260 に答える
0

SignedXml は u:Id を有効な XML ID として認識せず、XML 署名では XML ID である必要があります。

スキーマ (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd WS-Security Id を使用しようとしている場合) を使用するか、 XML フラグメントに DTD を追加します。( ]> XML フラグメントの場合)。LoadXml だけに DTD を追加すると、SignedXml が Id を認識できるようになりますが、SOAP では DTD が許可されないため、オンザワイヤ SOAP に DTD を含めないでください。

于 2011-03-25T15:21:07.957 に答える