WCFTestClient HTTP请求是未经授权的客户端身份validationscheme“匿名”

我已经创build了一个WCF服务并将其部署在Server上。 当我浏览这个服务,它给了我积极的回应?wsdlurl。 现在我试图通过WCF Test客户端来testing服务。 它显示适当的元数据。 但是,当我尝试从服务中调用任何方法时,它显示了一个例外…这里是堆栈跟踪的错误细节..

HTTP请求未经授权,客户端身份validationscheme为“匿名”。 从服务器收到的身份validation头是“Negotiate,NTLM”。

服务器堆栈跟踪:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory工厂)
HTTP请求未经授权,客户端身份validationscheme为“匿名”。 从服务器收到的身份validation头是“Negotiate,NTLM”。

服务器堆栈跟踪:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory工厂)

客户端绑定:

<bindings> <wsHttpBinding> <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="None"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> </security> </binding> </wsHttpBinding> </bindings> 

服务器绑定:

 <bindings> <wsHttpBinding> <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="None"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> </security> </binding> <binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> <security mode="None"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/> <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/> </security> </binding> </wsHttpBinding> </bindings> 

客户的客户部分:

 <client> <endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService" contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" /> </client> 

服务器的服务部分:

 <services> <service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior" name="GeoService.Saveology.com.CityStateServiceProvider"> <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService" contract="SEO.Common.ServiceContract.ICityStateService" /> <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> </service> <service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior" name="GeoService.Saveology.com.ServiceMagicServiceProvider"> <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding" contract="SEO.Common.ServiceContract.IServiceMagicService"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> </service> </services> 

我没有控制我正在调用的服务的安全configuration,但得到了同样的错误。 我能够修复我的客户如下。

  1. 在configuration中,设置安全模式:

     <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> 
  2. 在代码中,将代理类设置为允许模拟(我添加了对称为客户的服务的引用):

     Customer_PortClient proxy = new Customer_PortClient(); proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

我有一个类似的问题,你有没有尝试过:

 proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

我看到这还没有回答,这是从这里确切的引用:

WSHttpBinding将尝试在SSP层执行内部协商。 为了这个成功,你需要在VDir中允许匿名的IIS。 WCF将默认通过SPNEGO获取窗口凭证。 允许匿名在IIS层不允许任何人,它是推迟到WCF堆栈。

我发现这个: http : //fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

Googlesearch后: http : //www.google.tt/#hl=zh-CN&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

我有一个类似的问题,并尝试上面提到的一切。 然后我试着改变clientCreditialType为基本和一切工作正常。

 <basicHttpBinding> <binding name="BINDINGNAMEGOESHERE" > <security mode="TransportCredentialOnly"> <transport clientCredentialType="Basic"></transport> </security> </binding> </basicHttpBinding> 

以下是我必须做的才能做到这一点。 意即:

  1. 自定义UserNamePasswordValidator(不需要Windows帐户,SQLServer或ActiveDirectory – 您的UserNamePasswordValidator可以有用户名和密码硬编码,或从文本文件,MySQL或其他)读取它。
  2. HTTPS
  3. IIS7
  4. .net 4.0

我的网站是通过DotNetPanel进行pipe理的。 它有3个虚拟目录安全选项:

  1. 允许匿名访问
  2. 启用基本authentication
  3. 启用集成Windows身份validation

只需要“允许匿名访问”(虽然这本身是不够的)。

设置

 proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

没有在我的情况下有所作为。

但是,使用此绑定工作:

  <security mode="TransportWithMessageCredential"> <transport clientCredentialType="Windows" /> <message clientCredentialType="UserName" /> </security> 

另一个可能的解决scheme,我发现这个错误。 可能没有回答OP的确切问题,但可以帮助其他谁偶然发现这个错误信息。

我使用WebHttpBinding在代码中创build了我的客户端,以复制以下行:

 <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="Windows" /> </security> 

我必须做:

 var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows; 

以及设置proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

尝试在您的客户端提供用户名和密码,如下所示

client.ClientCredentials.UserName.UserName = @“Domain \ username”; client.ClientCredentials.UserName.Password =“password”;

刚刚在开发机器上遇到这个问题(生产工作很好)。 我在IIS中修改我的configuration,允许匿名访问,并把我的名字和密码作为凭据。

不是我确定的最好的方式,但它可以用于testing目的。

今天,我在部署我们的服务调用一个外部服务到azure色的登台环境后,我有同样的错误。 本地服务称为外部服务,没有错误,但部署后没有。

最后,事实certificate,外部服务具有IPvalidation。 Azure中的新环境有另一个IP,它被拒绝了。

所以,如果你得到这个错误调用外部服务

这可能是IP限制。