我如何以编程方式分配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"或者如果我做错了什么?

我如何以编程方式分配WCF ClientCredentials servicecercertificate属性

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