1

我有一个使用 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 框上的机器帐户。

4

1 回答 1

0

好吧,也许不是我想要的,但我让它工作了。必须是域中的 IIS 与非域中的差异。

以下是我对服务 Web 配置的更改:

<security mode="Transport">
  <transport clientCredentialType="Basic" />
</security>

据我了解,这不会在 SOAP 标头中传递凭据,而是在 HTTP 标头中传递凭据,这意味着消息级别的安全性在这种情况下不起作用。它全部受 SSL 证书保护。

于 2009-11-03T19:09:26.803 回答