7

セキュリティ ヘッダーに参照を追加しようとすると、かなり一般的なエラーが発生します。

不正な参照要素

同様の結果で次のことを試しました:

  1. 要素の をオブジェクトIDの として渡すことにより、ドキュメント内の要素を参照します。URIReference
  2. メソッドを介して にXmlElementオブジェクトを渡します。この StackOverflow postにあるオーバーロードを使用して参照を取得しています。ReferenceLoadXml()XmlElementGetIdElement

として空の文字列を渡すとURI、 のComputeSignature()メソッドはSignedXml期待どおりに機能します。ただし、セキュリティ ヘッダーへの参照を最大 3 つ追加する必要があります。

更新 #1このブログ投稿
の おかげで、そこから簡略化されたバージョンを作成できました。問題の原因は、属性とプレフィックスの使用にあると思います。Namespace

更新 #2要素の属性の
名前空間宣言がこのエラーの原因となっているようです。Id<Timestamp>

更新#3
これでうまく いったと思います。以下の私の回答投稿を参照してください。

作業サンプル:名前空間が定義された は機能しないことに
注意してください。Id XAttribute名前空間が定義されていId XAttributeない場合は機能します。

private void CreateSecurityAndTimestampXML(string fileName)
{
    TimestampID = "TS-E" + GUID.NewGuid();
    DateTime SecurityTimestampUTC = DateTime.UtcNow;

    XDocument xdoc = new XDocument(
        new XElement(wsse + "Security",
            new XAttribute(XNamespace.Xmlns + "wsse", wsse.NamespaceName),
            new XAttribute(XNamespace.Xmlns + "wsu", wsu.NamespaceName),
            new XElement(wsu + "Timestamp",
                // new XAttribute(wsu + "Id", TimestampID), // <-- Does Not Work
                new XAttribute("Id", TimestampID), // <-- Works
                new XElement(wsu + "Created", SecurityTimestampUTC.ToString(_timestampFormat)),
                new XElement(wsu + "Expires", SecurityTimestampUTC.AddMinutes(10).ToString(_timestampFormat))
            )
        )
    );

    using (XmlTextWriter tw = new XmlTextWriter(fileName, new UTF8Encoding(false)))
    {
        xdoc.WriteTo(tw);
    }
}

// Snippet
string[] elements = { TimestampID };

foreach (string s in elements)
{
    Reference reference = new Reference()
    {
        Uri = "#" + s
    };

    XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
    env.InclusiveNamespacesPrefixList = _includedPrefixList;
    reference.AddTransform(env);

    xSigned.AddReference(reference);
}

// Add Key Info Here.

// Compute the Signature.
xSigned.ComputeSignature();
4

1 に答える 1