2016-07-24 15 views
2

Ich muss Code von WSE2 zu WCF konvertieren und brauche ein paar Tipps, wie man das Signieren einer SOAP-Nachricht mit einem X509Certificate2-Objekt implementiert.WSE2 to WCF: Signieren einer SOAP-Nachricht

WSe2 Code:

X509SecurityToken tok = new X509SecurityToken(cert); 
SoapContext cont = cfs.RequestSoapContext; 
cont.Security.Tokens.Add(tok); 
cont.Security.Elements.Add(new MessageSignature(tok)); 

"cert" ist mein X509Certificate2 Objekt und "cfs" Objekt meiner Web Services Client ist.

Wie kann ich das ohne WSE2 machen, wie geht das Gleiche in WCF?

Antwort

0

Sie können eine benutzerdefinierte Bindung dafür verwenden, aber zuerst müssen Sie herausfinden, welche Art von Bindung Sie benötigen. Schau here und here. Bei der benutzerdefinierten Bindung können Sie ein Sicherheitstoken zum Signieren hinzufügen. Meine asymmetrische Bindung sieht wie folgt aus:

AsymmetricSecurityBindingElement asymmetricBinding = SecurityBindingElement.CreateMutualCertificateDuplexBindingElement(
       MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10); 
     asymmetricBinding.InitiatorTokenParameters = new X509SecurityTokenParameters 
     { 
      InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient 
     }; 
     asymmetricBinding.RecipientTokenParameters = new X509SecurityTokenParameters 
     { 
      InclusionMode = SecurityTokenInclusionMode.Never 
     }; 
     asymmetricBinding.EndpointSupportingTokenParameters.SignedEncrypted.Add(new UserNameSecurityTokenParameters 
     { 
      InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient 
     }); 
     asymmetricBinding.IncludeTimestamp = true; 
     asymmetricBinding.SecurityHeaderLayout = SecurityHeaderLayout.Strict; 
     asymmetricBinding.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt; 

     var textMessageEncoding = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8)); 
     var httpsTransport = new HttpsTransportBindingElement(); 

     CustomBinding b = new CustomBinding(asymmetricBinding, textMessageEncoding, httpsTransport); 

Dann können Sie Zertifikate auf ClientCredentials der EndpointClient

var wsClient = new YourEndpointClient(b, new EndpointAddress(yourWsEndPointAddress)); 
wsClient.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(cert); 
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(cert); 
gesetzt (aber auch symmetrische Bindung verwenden können)