我有一个使用 basicHTTP 绑定的 WCF 服务。该服务的目标是在运行 IIS 7.0 且不在 Active Directory 域中的 Windows Server 2008 64 位上的 DMZ 环境中部署。
业务合作伙伴将通过具有 SSL 保护的 Internet 访问该服务。最初,我构建了服务以使用带有 wsHTTPBinding 的 x.509 消息身份验证,在遇到很多问题后,我决定备份并使用带有 UserName 身份验证的 basicHTTP。
结果:与我在证书模式下收到的完全相同的、晦涩的错误消息。
该服务在我们的域内使用完全相同的身份验证完美运行,但一旦我将其移动到 DMZ,我就会收到一条错误消息:“收到来自另一方的不安全或不正确安全的故障。有关故障代码,请参阅内部 FaultException和细节”。
内部异常消息是:“验证消息的安全性时发生错误。”
带有绑定配置的服务的 web 配置如下:
<services>
<service behaviorConfiguration="HSSanoviaFacade.Service1Behavior" name="HSSanoviaFacade.HSSanoviaFacade">
<endpoint address="" binding="basicHttpBinding" contract="HSSanoviaFacade.IHSSanoviaFacade" bindingConfiguration="basicHttp">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="https://FULLY QUALIFIED HOST NAME CHANGED TO PROTECT/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicHttp">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="HSSanoviaFacade.Service1Behavior">
<serviceMetadata httpsGetEnabled="True" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
得到错误的测试客户端的配置:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IHSSanoviaFacade" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://HOST NAME CHANGED TO PROTECT"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IHSSanoviaFacade"
contract="MembersService.IHSSanoviaFacade" name="BasicHttpBinding_IHSSanoviaFacade" />
</client>
如前所述,该服务在域上完美运行,而生产 IIS 框不在域上。我已经调整和拉出我的头发 2 周了,但似乎没有任何效果。如果有人可以提供帮助,我将不胜感激。甚至建议解决身份验证问题。我宁愿不使用自定义身份验证方案,而是使用内置的 SOAP 功能。
凭据通过代理传递,即 proxy.ClientCredentials.UserName.UserName 和 proxy.ClientCredentials.UserName.Password 是测试环境中内部域上的有效帐户以及 DMZ IIS 框上的机器帐户。