セキュリティ ヘッダーに参照を追加しようとすると、かなり一般的なエラーが発生します。
不正な参照要素
同様の結果で次のことを試しました:
- 要素の をオブジェクト
ID
の として渡すことにより、ドキュメント内の要素を参照します。URI
Reference
- メソッドを介して に
XmlElement
オブジェクトを渡します。この StackOverflow postにあるオーバーロードを使用して参照を取得しています。Reference
LoadXml()
XmlElement
GetIdElement
として空の文字列を渡すと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();