从另一个WCF服务调用WCF服务

时间:2010-03-25 15:10:41

标签: wcf wcf-security x509certificate

我在Server1上的Windows服务上托管了WCF服务。它在这台机器上也有IIS。我从网络应用程序调用该服务,它工作正常。但是在这个服务中,我必须调用位于Server2上的另一个WCF服务(也在Windows服务上托管)。安全凭证设置为“消息”和“用户名”。我有一个错误,如“SOAP protcol negociation failed”。这是我的服务器证书公钥的一个问题,似乎无法识别。但是,如果我在控制台应用程序中从Server1调用Server2上的服务,它可以正常工作。

我按照本教程设置了我的证书:http://www.codeproject.com/KB/WCF/wcf_certificates.aspx

这是我在Server1上的服务尝试调用第二个的配置文件:

                                                                   

    <endpoint address=""
              binding="wsHttpBinding"
              contract="Microsoft.ServiceModel.Samples.ITraitement" />


    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>

</services>

<client>
  <endpoint address="http://Server2:8000/servicemodelsamples/service"
    behaviorConfiguration="myClientBehavior" binding="wsHttpBinding"
    bindingConfiguration="MybindingCon" contract="Microsoft.ServiceModel.Samples.ICalculator"
    name="">
    <identity>
      <dns value="ODWCertificatServeur" />
    </identity>
  </endpoint>
</client>

<bindings>
  <wsHttpBinding>
    <binding name="MybindingCon">
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceTraitementBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="myClientBehavior">
      <clientCredentials>
        <clientCertificate findValue="MachineServiceTraitement" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />
        <serviceCertificate>
          <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck"/>
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

这是来自Web应用程序的配置文件,它调用Server1上的服务:

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_ITraitement" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
          enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
            algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:8020/ServiceTraitementPC"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITraitement"
      contract="ITraitement" name="WSHttpBinding_ITraitement">
  </endpoint>
</client>

如果我在控制台应用程序中调用它而不是从我的服务中调用它,请知道它为什么有效?也许它与certificateValidationMode =“ChainTrust”有关?

2 个答案:

答案 0 :(得分:2)

嗯,最后,这只是在客户端计算机上信任证书颁发者的问题。在教程中提到过,我一定错过了这一步。仍然想知道为什么它在从控制台应用程序调用时起作用,但是......无论如何,它现在工作正常。

谢谢!

答案 1 :(得分:1)

当您从控制台应用程序调用服务时,您处于登录用户的安全上下文中。

当您使用默认设置从IIS中运行的服务调用服务时,您处于本地帐户NETWORK SERVICE的安全上下文中。

修复它的方法可能是在web.config的system.web部分设置impersonate = true。