我如何以编程方式分配WCF ClientCredentials servicecercertificate属性
本文关键字:WCF ClientCredentials servicecercertificate 属性 分配 方式 编程 | 更新日期: 2023-09-27 18:06:29
我有一个使用自签名证书通过https托管的WCF服务。我在以编程方式创建绑定时遇到了麻烦:特别是端点行为的那一部分。
My Service配置如下:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="DisableServiceCertificateValidation">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None"
revocationMode="NoCheck" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="ContactEmail.Web.EmailService.customBinding0">
<binaryMessageEncoding />
<httpsTransport/>
</binding>
</customBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="ContactEmail.Web.EmailService">
<endpoint address="https://xxxxxxxxxxxxxx/EmailService/EmailService.svc" binding="customBinding" bindingConfiguration="ContactEmail.Web.EmailService.customBinding0" contract="ContactEmail.Web.EmailService" behaviorConfiguration="DisableServiceCertificateValidation" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
当我使用"添加服务引用"特性时,生成的客户端按预期工作。假设我像这样调用设置一个证书验证回调:
System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
但是,我需要以编程方式设置它,而不是通过客户机上的配置文件提供服务配置,因为调用将是公共共享库的一部分。因此,我试图通过向客户端构造函数提供我自己的参数来做到这一点,例如:
var myClient = new EmailServiceClient(GetBinding(), new EndpointAddress(Strings.EmailServiceEndpointAddress));
在GetBinding(),我创建CustomBinding与bindingelement,如HttpsTransportBindingElement, BinaryMessageEncodingBindingElement和SecurityBindingElement.CreateSecureConversationBindingElement(securitybindingelement . createusernameovertransportindingelement())。
你知道我如何指定的东西像certificateValidationMode="None"和revocationMode="NoCheck"或者如果我做错了什么?
SecureConversation
是WS-SecureConversation =>高级消息级安全的实现,其中在第一次调用服务(通过作为参数传递给绑定元素创建的消息安全模式进行身份验证)期间创建特殊的安全令牌,并使用此令牌保护后续消息。此安全性还形成了称为安全上下文或安全会话的内容。
配置文件中当前的绑定没有使用SecureConversation
,所以代码中定义的绑定与您的服务不兼容
你应该有一个凭据属性(类型ClientCredentials) (http://msdn.microsoft.com/en-us/library/ms733836.aspx)在你的ClientBase (EmailServiceClient)…它应该有一个servicecercertificate属性:http://msdn.microsoft.com/en-us/library/system.servicemodel.description.clientcredentials.servicecertificate.aspx