无法从IIS 7.5中承载的Web应用程序连接到WCF服务

时间:2012-09-21 11:54:45

标签: .net wcf iis ssl

我有以下问题。我有一台运行WCF服务的机器。此服务配置如下:

<system.web>
  <authentication mode="Windows" />
</system.web>
<system.serviceModel>
  <client />
  <services>
    <service name="AnchorWcfService.AnchorService" behaviorConfiguration="serviceBehavior">
      <endpoint address="AnchorService" contract="AnchorWcfService.IAnchorService" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" />
      <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpsBinding" />
    </service>
  </services>
  <bindings>
    <wsHttpBinding>
      <binding name="TransportSecurity" maxReceivedMessageSize="5000000">
        <readerQuotas maxStringContentLength="5000000" maxDepth="128" maxArrayLength="5000000" />
        <security mode="Transport">
          <transport clientCredentialType="Windows" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="serviceBehavior">
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceMetadata httpsGetEnabled="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

此服务设置为使用HTTPS,我使用netsh命令行工具添加了必要的测试证书。我已通过以下方式创建证书:

首先,我在我的机器上运行此命令以创建根证书

makecert -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.cer

然后我将cer文件复制到托管wcf服务的机器和Web服务器,并使用mmc导入它。

然后在托管wcf服务的机器上运行了附加命令;

makecert -sk MyWcfService -iv RootCATest.pvk -n "CN=1.2.3.4" -ic RootCATest.cer -sr localmachine -ss my -sky exchange -pe 

其中1.2.3.4是托管wcf服务的机器的IP。

然后我创建了这样的SSL证书:

netsh http add sslcert ipport=0.0.0.0:8080 certhash=<Thumbprint from the sertificate created in the last step> appid={00112233-4455-6677-8899-AABBCCDDEEFF}

从我使用wcftestclient和我创建的另一个.NET控制台应用程序成功连接到此服务的Web服务器计算机。

问题是当我尝试从Web应用程序连接时。我在控制台应用程序和Web应用程序中使用完全相同的代码来使用WCF服务:

IAnchorService channel = null;
var binding = new WSHttpBinding(SecurityMode.Transport);
var channel = ChannelFactory<IAnchorService>.CreateChannel(binding, endpoint.Address);
var anchor = channel.GetAnchorDetails();

在控制台应用程序上,最后一行成功从wcf服务检索锚点详细信息,但在Web应用程序中,我得到以下异常:

System.ServiceModel.Security.MessageSecurityException: The HTTP request was forbidden with client authentication scheme 'Negotiate'. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.

我还测试过删除Security.Transport并在客户端和服务器上设置Security.None(所以使用普通的HTTP而不是HTTPS),然后一切正常。

此外,如果我将服务放在与Web服务器相同的计算机上,但仍然使用HTTPS,它也可以工作。

因此,只有在不同的计算机上运行Web服务器和wcf服务并且启用了SSL时,它才会失败。

我已经尝试过现在能想到的一切。我需要做些什么才能使我的Web应用程序正常工作?

0 个答案:

没有答案