1

我有以下问题。我有一台运行 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}

从 Web 服务器机器上,我已经使用wcftestclient我创建的另一个 .NET 控制台应用程序成功连接到该服务。

问题是当我尝试从 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 应用程序上运行?

4

0 回答 0