我有以下问题。我有一台运行 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 应用程序上运行?