[英]WCF service with Windows authentication throws exception “Username not defined” even if it is defined
我正在C#控制台项目上使用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
对象等。
这是由于您的应用程序配置的这一行:
<message clientCredentialType="UserName" algorithmSuite="Default" />
但是我不明白为什么要修改您的应用程序配置。 通常,当您添加服务引用时,它会基于服务的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>
您不需要指定传输安全标签。 由于使用HTTPS连接来保护您的安全,因此传输已得到保护。 对于这种安全模式,传输标签在您的应用程序中不会起作用。 对于您遇到的错误,请确保仅在IIS中启用匿名身份验证。 然后尝试再次运行该应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.