2010-03-25 16 views
1

Je dois utiliser la technique d'interrogation pour informer les clients des changements survenus du côté serveur. J'ai donc essayé d'utiliser DuplexHttpBinding (http://code.msdn.microsoft.com/duplexhttp). Je fonctionne bien avec les messages non sécurisés, mais j'ai besoin d'utiliser la sécurité au niveau des messages dans mon projet (UsernameForCertificate). Ok, j'ai décidé d'ajouter SymmetricSecurityBindingElement à la collection de liens:Sécurité des messages personnalisés WCF

var securityElement = SecurityBindingElement.CreateUserNameForCertificateBindingElement(); 
collection.Add(securityElement); 

Puis un problème est survenu. Si nous utilisons la sécurité au niveau des messages tous les messages incluent les en-têtes de sécurité avec signature du message, comme celui-ci:

<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
.... 
</o:Security> 

et les messages de vote personnalisés qui sont envoyés par voie de requête personnalisée n'a pas les en-têtes de sécurité, donc exception se produit lors de l'envoi de ce message à travers le canal avec la sécurité au niveau du message:

System.ServiceModel.Security.MessageSecurityException, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
No signature message parts were specified for messages with the 'http://samples.microsoft.com/duplexhttp/pollingAction' action. 

S'il vous plaît, solution de conseils comment ajouter des en-têtes de sécurité propres à mes messages de vote personnalisés avant de les envoyer dans le canal de demande personnalisée. Vous pouvez télécharger le code source par le lien posté avant et essayez simplement de l'utiliser avec la sécurité UsernameForCertificate pour reproduire le problème. Merci.

Répondre

2

Après quelques jours & enquête approfondie J'ai trouvé la solution. Il semble que nous devions modifier ChannelProtectionRequirements lors de la création de Channel Listener personnalisé pour ajouter des parties de signature à nos messages personnalisés de chiffrement &. Voici l'exemple:

private static void ApplyChannelProtectionRequirements(BindingContext context) 
    { 
     var cpr = context.BindingParameters.Find<ChannelProtectionRequirements>(); 
     if (cpr != null) 
     { 
      XmlQualifiedName qName = new XmlQualifiedName("customHeader", "namespace"); 
      MessagePartSpecification part = new MessagePartSpecification(qName); 
      cpr.IncomingEncryptionParts.AddParts(part, "incomingAction"); 
      cpr.IncomingSignatureParts.AddParts(part, "incomingAction"); 
      cpr.OutgoingEncryptionParts.AddParts(part, "outgoingAction"); 
      cpr.OutgoingSignatureParts.AddParts(part, "outgoingAction"); 
     } 
    } 
+0

Où appelez-vous votre méthode privée 'ApplyChannelProtectionRequirements' ?. –

Questions connexes