2016-07-24 119 views
2

我需要將WSE2中的代碼隱藏到WCF,並需要關於如何實現使用X509Certificate2對象簽署SOAP消息的一些提示。WSE2到WCF:簽署SOAP消息

WSE2代碼:

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

「認證」 是我X509Certificate2對象和 「三特」 是我的Web服務客戶端對象。

如何在沒有WSE2的情況下使這項工作如何在WCF中完成?

回答

0

你可以使用自定義的綁定,但首先你必須找出你需要哪種綁定。看看herehere。在自定義綁定上,您可以添加安全令牌進行簽名。我的不對稱綁定看起來像這樣:(但你也可以使用對稱綁定)

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

然後你就可以在EndpointClient的ClientCredentials設置證書

var wsClient = new YourEndpointClient(b, new EndpointAddress(yourWsEndPointAddress)); 
wsClient.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(cert); 
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(cert);