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