使用Windows身份验证的WCF服务会抛出异常“用户名未定义”,即使已定义

时间:2015-05-13 09:21:46

标签: c# .net web-services wcf

我在C#Console项目上使用WCF服务。此WCF服务使用Windows身份验证和HTTPS,因此我修改了我的App.config,如下所示:

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <bindings>
      <basicHttpsBinding>
        <binding name="TestYannisSOAPBinding">
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" proxyCredentialType="Windows" realm="xxxxx.xxxx.eu" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
        <binding name="TestYannisSOAPBinding1" />
      </basicHttpsBinding>
    </bindings>
    <client>
      <endpoint address="https://xxxxx.xxxxx.eu/TESTYANNIS_WEB/awws/TestYannis.awws"
              binding="basicHttpsBinding" bindingConfiguration="TestYannisSOAPBinding"
              contract="ServiceReference1.TestYannisSOAPPortType" name="TestYannisSOAPPort" />
    </client>        
  </system.serviceModel>
</configuration>

如您所见,我指定了一种安全模式TransportWithMessageCredential,将传输作为Windows客户端凭据类型。

在我的代码背后,我确实指定了这样的Windows凭据:

TestYannisSOAPPortTypeClient client = new TestYannisSOAPPortTypeClient();
client.ClientCredentials.Windows.ClientCredential.UserName = "yannis";
client.ClientCredentials.Windows.ClientCredential.Password = "xxxxxx";

在运行时,我收到此异常:

  

System.InvalidOperationException:未定义用户名。在ClientCredentials中指定用户名。

我可以通过指定用户名和密码来消除此异常:

client.ClientCredentials.UserName.UserName = "yannis";
client.ClientCredentials.UserName.Password = "xxxxxx";

但是这次我从远程服务器获得一个异常,不希望我以这种方式进行身份验证。为什么只挖掘client.ClientCredentials而不是Windows.ClientCredential

我可以说WCF服务在服务器端使用名为Ready!API的服务测试软件。以下是完全相同请求的屏幕截图:

enter image description here

我想问题出现在我的App.config上,但我已经尝试了一切。安全模式为Transport,有或没有Message对象等。

2 个答案:

答案 0 :(得分:0)

这是由于您的应用配置的这一行:

 <message clientCredentialType="UserName" algorithmSuite="Default" />

但我不明白为什么要修改你的app配置。通常在添加服务引用时,它会根据服务的wsdl生成正确的绑定。 要使用Windows身份验证,您应该在绑定中写入:

  <binding name="TestYannisSOAPBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" ... />
      </security>
    </binding>

你可以尝试这种情况:

        <binding name="TestYannisSOAPBinding">
            <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="None" />
                <message clientCredentialType="Windows"/>
            </security>
        </binding>

答案 1 :(得分:0)

您无需指定传输安全标记。由于您使用HTTPS连接进行保护,因此传输已受到保护。对于此安全模式,应用程序中的传输标记不会生效。对于您收到的错误,请确保仅在IIS中启用匿名身份验证。然后再次尝试运行该应用程序。