.net WCF错误:服务未对调用方进行身份验证

.net WCF错误:服务未对调用方进行身份验证,.net,wcf,security,wcf-binding,.net,Wcf,Security,Wcf Binding,我正在尝试从客户端控制台应用程序访问服务器上的WCF服务以进行测试。我得到以下错误: 调用方未通过身份验证 服务 我正在使用wsHttpBinding。我不确定服务需要什么样的身份验证 更新 如果我将绑定更改为(从wsHttpBinding开始),它会工作 在承载IIS 7.0的windows 2008 server上,您是否尝试过使用basicHttpBinding而不是wsHttpBinding?如果您不需要任何身份验证,并且不需要Ws-*实现,那么最好使用普通的basicHt

我正在尝试从客户端控制台应用程序访问服务器上的WCF服务以进行测试。我得到以下错误:

调用方未通过身份验证 服务

我正在使用
wsHttpBinding
。我不确定服务需要什么样的身份验证




更新 如果我将绑定更改为
(从wsHttpBinding开始),它会工作
在承载IIS 7.0的windows 2008 server上,您是否尝试过使用basicHttpBinding而不是wsHttpBinding?如果您不需要任何身份验证,并且不需要Ws-*实现,那么最好使用普通的basicHttpBinding。WsHttpBinding为消息安全性和身份验证实现WS-Security。

如果使用basicHttpBinding,请将端点安全性配置为“无”,并将clientCredintialType传输为“无”


另外,确保IIS中的目录身份验证方法启用匿名访问

我知道了

如果您想使用wshttpbinding,您需要添加windows凭据,如下所示

svc.ClientCredentials.Windows.ClientCredential.UserName = "abc";
svc.ClientCredentials.Windows.ClientCredential.Password = "xxx";

谢谢

在虚拟目录中设置匿名访问

向您的服务写入以下凭据

ADTService.ServiceClient adtService = new ADTService.ServiceClient();
adtService.ClientCredentials.Windows.ClientCredential.UserName="windowsuseraccountname";
adtService.ClientCredentials.Windows.ClientCredential.Password="windowsuseraccountpassword";
adtService.ClientCredentials.Windows.ClientCredential.Domain="windowspcname";

然后调用您的Web服务方法。

为什么您不能完全删除wsHttpBinding的安全设置(“无”而不是“消息”或“传输”)?

如果您使用的是像我这样的自托管站点,则可以避免此问题(如上所述)是在主机和客户端都规定wsHttpBinding安全模式=无

在客户端和主机上创建绑定时,可以使用以下代码:

 Dim binding as System.ServiceModel.WSHttpBinding 
 binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None)


如果需要在webconfig中指定域(授权客户端使用的用户名和密码),可以将其放入system.serviceModel services服务部分:

<identity>          
<servicePrincipalName value="example.com" />
</identity>

我通过以下步骤解决了共享问题:

  • 转到IIS-->站点-->您的站点-->
  • 功能视图窗格-->身份验证
  • 将匿名身份验证设置为禁用
  • 将Windows身份验证设置为启用

  • 如果客户端位于与服务器不同的域中,则可能会导致此问题


    我在测试从PC(客户端)到云测试服务器的一个应用程序时遇到了这种情况,我能想到的最简单的解决方案是设置vpn

    我在
    wsHtppBinding
    中也遇到了同样的问题。我只需添加指向
    none
    security
    模式,就解决了我的问题,而且不需要切换到
    basicHttpBinding
    。并检查如何禁用WCF安全性。检查以下配置更改以供参考:

    <wsHttpBinding>
        <binding name="soapBinding">
            <security mode="None">
                <transport clientCredentialType="None" />
                <message establishSecurityContext="false" />
            </security>
        </binding>
    </wsHttpBinding>
    
    
    
    编辑您的帖子并添加.config文件的相关部分。您试图使用的WCF服务是如何托管的?如果托管在IIS中,则目录安全设置为什么?匿名还是Windows集成?您能否标记此问题的答案。您似乎能够解决问题。为我解决的操作是将应用程序池标识从“ApplicationPoolIdentity”更改为“NetworkService”。并且您可能也需要域(.ClientCredentials.Windows.ClientCredential.Domain)我遇到了奇怪的情况。从一台机器上,我可以在没有显式ClientCredential.Domain的情况下访问服务,而从另一台机器上,如果没有Domain,它就无法工作。当某人的安全性出现问题时,用“为什么必须使用安全性”这一问题来回答他们是不太有建设性的这是一个合理的问题,假设他们的应用程序需要一个安全的配置,他们需要的是一个答案,而不是一个愚蠢的问题。我不同意-当你开始使用这个领域的任何技术并使用示例项目时,默认情况下,很容易会启用大量安全功能,而您不一定需要这些功能。@KhumeshKumawat您可以创建并验证自己的答案(如果需要),或者只验证现有答案中的一个(即使它不是您选择的答案)。你的问题有6万多个观点,所以这是一个重要的问题。它应该得到一个“官方”的答案。额外的域名是我问题的解决方案,这在下面更可信的答案中缺失了
     System.ServiceModel.WSHttpBinding binding
     binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);
    
    <identity>          
    <servicePrincipalName value="example.com" />
    </identity>
    
     client.ClientCredentials.Windows.ClientCredential.Domain = "example.com";
     client.ClientCredentials.Windows.ClientCredential.UserName = "UserName ";
     client.ClientCredentials.Windows.ClientCredential.Password = "Password";
    
    <wsHttpBinding>
        <binding name="soapBinding">
            <security mode="None">
                <transport clientCredentialType="None" />
                <message establishSecurityContext="false" />
            </security>
        </binding>
    </wsHttpBinding>