我在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的服务测试软件。以下是完全相同请求的屏幕截图:
我想问题出现在我的App.config上,但我已经尝试了一切。安全模式为Transport
,有或没有Message
对象等。
答案 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中启用匿名身份验证。然后再次尝试运行该应用程序。