0

我在我的 wcf 服务上设置 TransportWithMessageCredential 时遇到问题。

使用 wcf 配置编辑器,我在服务的 web.config 和我的可执行文件的 app.config 中将 Mode 设置为 TransportWithMessageCredential,将 transportClientCredentialType 设置为 Windows。我在 erver 上安装了一个自签名证书并配置了 IIS 以使用它。

当我运行我的测试应用程序时,我收到以下错误:System.InvalidOperationException:未提供用户名。在 ClientCredentials 中指定用户名。

似乎 Windows 凭据没有传递给 wcf 服务,当我检查 credentialCache.defaultCredentials 时,它们为空。关于为什么会这样以及如何解决它的任何线索和/或提示?提前致谢

活动目录域上的服务器 2003 / IIS 6.0。

服务的 web.config

<service name="Test.DiagnosticService">
    <endpoint binding="basicHttpBinding" bindingConfiguration="WindowsTransportCredentialBinding" name="ClientDiagnosticEndpoint" contract="Test.IDiagnostic" />
</service>

<basicHttpBinding>
    <binding name="WindowsTransportCredentialBinding" maxBufferSize="524288"
     maxReceivedMessageSize="524288">
        <readerQuotas maxDepth="128" maxStringContentLength="1048576" />
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" proxyCredentialType="Windows" />
        </security>
    </binding>

可执行文件的 app.config

<client>
<endpoint address="https://U-WM-3vIntegr8/test/Web/Services/Diagnostic.svc"
    binding="basicHttpBinding" bindingConfiguration="ClientHttpEndpoint"
    contract="Test.IDiagnostic" name="ClientDiagnosticEndpoint" />
</client>


<basicHttpBinding>
    <binding name="ClientHttpEndpoint" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:02:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="4194304" maxBufferPoolSize="524288" maxReceivedMessageSize="4194304"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="1048576"
        maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Windows" proxyCredentialType="Windows"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
</basicHttpBinding>

...从客户端调用

public static IDiagnostic GetDiagnosticService()
{
    return new ChannelFactory<IDiagnostic>("ClientDiagnosticEndpoint").CreateChannel();
}
4

1 回答 1

2

您需要手动填写凭据,它们不会在此配置中自动传递。如果这就是您要查找的内容,则应在客户端和服务器上将 clientCredentialType 设置为“Windows”。现在您需要手动设置它:

proxy.ClientCredentials.Username.User = ""
proxy.ClientCredentials.Username.Password = ""
于 2012-05-23T09:23:06.150 回答