Как подписать пользовательский заголовок мыла?
Я добавил пользовательский заголовок мыла <MyApp:FOO>
элемент к <soap:Header>
элемент и требования гласят, что я должен подписать этот элемент, как это сделать?<MyApp:FOO>
содержит ряд вещей (имя пользователя, настройки и т. д.), которые идентифицируют пользователя на более высоком уровне. Я успешно использовал файл политики и теперь policyClass с CertificateAssertions и SoapFilters для подписи wsu:Timestamp, wsu:action, wsu:MessageId и т. Д. Но теперь <MyApp:FOO>
Элемент должен быть подписан.
На данный момент я понял, что элемент, который должен быть подписан, должен быть идентифицирован атрибутом wsu:Id, а затем преобразован с использованием xml-exc-c14n.
Итак, как мне указать, что мыльный заголовок должен быть подписан, а? Это текущий класс, который я использую для подписания моего сообщения.
internal class FOOClientOutFilter: SendSecurityFilter
{
X509SecurityToken clientToken;
public FOOClientOutFilter(SSEKCertificateAssertion parentAssertion)
: base(parentAssertion.ServiceActor, true)
{
// Get the client security token.
clientToken = X509TokenProvider.CreateToken(StoreLocation.CurrentUser, StoreName.My, "CN=TestClientCert");
// Get the server security token.
serverToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine, StoreName.My, "CN=TestServerCert");
}
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
// Sign the SOAP message with the client's security token.
security.Tokens.Add(clientToken);
security.Elements.Add(new MessageSignature(clientToken));
}
}
2 ответа
Моя текущая версия SecureMessage, кажется, делает свое дело..
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
//EncryptedData data = new EncryptedData(userToken);
SignatureReference ssekSignature = new SignatureReference();
MessageSignature signature = new MessageSignature(clientToken);
// encrypt custom headers
for (int index = 0; index < envelope.Header.ChildNodes.Count; index++)
{
XmlElement child =
envelope.Header.ChildNodes[index] as XmlElement;
// find all FOO headers
if (child != null && child.Name == "FOO")
{
string id = Guid.NewGuid().ToString();
child.SetAttribute("Id", "http://docs.oasis-" +
"open.org/wss/2004/01/oasis-200401-" +
"wss-wssecurity-utility-1.0.xsd", id);
signature.AddReference(new SignatureReference("#" + id));
}
}
// Sign the SOAP message with the client's security token.
security.Tokens.Add(clientToken);
security.Elements.Add(signature);
}
Включая дополнительные статьи из MSDN