2008-09-30 3 views
2

J'ai ajouté un élément d'en-tête de savon personnalisé <MyApp:FOO> à l'élément <soap:Header> et les états requirments que je dois signer cet élément, comment ferait-on cela? <MyApp:FOO> contient un certain nombre de choses (nom d'utilisateur, préférences, etc) qui identifie un utilisateur de niveau supérieur. J'ai utilisé avec succès un fichier de stratégie et maintenant un policyClass avec CertificateAssertions et SoapFilters pour signer wsu: Timestamp, wsu: action, wsu: MessageId etc. Mais maintenant l'élément <MyApp:FOO> doit être signé aussi. Ce que j'ai compris jusqu'à présent, c'est que l'élément qui doit être signé doit être identifié avec un attribut wsu: Id, puis transformé en utilisant xml-exc-c14n. Donc, comment est-ce que je précise que l'en-tête de savon devrait être signé aussi bien? C'est la classe actuelle que j'utilise pour signer mon message.Comment signer un en-tête de savon personnalisé?

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)); 
} 
} 

Répondre

3

Ma version actuelle de SecureMessage semble faire l'affaire ..

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); 
    } 
Questions connexes