.net WCF错误:服务未对调用方进行身份验证
我正在尝试从客户端控制台应用程序访问服务器上的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
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>
我通过以下步骤解决了共享问题:
如果客户端位于与服务器不同的域中,则可能会导致此问题
我在测试从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>