Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有Windows身份验证的WCF服务引发异常“;“未定义用户名”;即使它被定义了_C#_.net_Web Services_Wcf - Fatal编程技术网

C# 具有Windows身份验证的WCF服务引发异常“;“未定义用户名”;即使它被定义了

C# 具有Windows身份验证的WCF服务引发异常“;“未定义用户名”;即使它被定义了,c#,.net,web-services,wcf,C#,.net,Web Services,Wcf,我在一个C#控制台项目上使用WCF服务。此WCF服务使用Windows身份验证和HTTPS,因此我修改了我的App.config,如下所示: 如您所见,我指定了安全模式TransportWithMessageCredential,将传输作为Windows客户端凭据类型 在我的代码隐藏中,我确实指定以下Windows凭据: TestYannisSOAPPortTypeClient=newtestyannissoapporttypeclient(); client.ClientCredentia

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


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

在我的代码隐藏中,我确实指定以下Windows凭据:

TestYannisSOAPPortTypeClient=newtestyannissoapporttypeclient();
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”;
但是,这次我从远程服务器得到一个异常,它不希望我以这种方式进行身份验证。为什么它只在
客户端.ClientCredentials
中挖掘,而不在
窗口.ClientCredential
中挖掘

我可以说,WCF服务通过使用名为Ready的服务测试软件在服务器端工作!应用程序编程接口。以下是完全相同请求的屏幕截图:


我猜问题出在我的App.config上,但我已经尝试了所有方法。安全模式为
传输
,有或没有
消息
对象等。

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

 <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中启用匿名身份验证。然后再次尝试运行应用程序。

嘿,基里尔,我想你错过了CTRL+V。你在说哪一行?不幸的是,在我的例子中,仅仅添加服务引用并不能生成正确的App.Config。。。默认情况下没有HTTPS和Windows身份验证。谢谢,但我应该写什么?clientCredentialType只能有证书或用户名值。。。两者都不起作用。根本不应该添加此行。应该是这样的:它也不起作用。首先,只有两种安全模式可用:“Transport”和“TransportWithMessageCredential”。如果我按照您的建议切换到传输并删除行,我将收到System.ServiceModel.Security.MessageSecurityException类型的异常,该异常表示我的HTTP请求未通过“Negociate”身份验证方案进行授权。从服务器收到的身份验证标头是“Basic realm=xxxxxx”内部异常中的错误401如果您写的不是“UserName”怎么办?