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,但得到了同样的错误。 我能够修复我的客户如下。
-
在configuration中,设置安全模式:
<security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security>
-
在代码中,将代理类设置为允许模拟(我添加了对称为客户的服务的引用):
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>
以下是我必须做的才能做到这一点。 意即:
- 自定义UserNamePasswordValidator(不需要Windows帐户,SQLServer或ActiveDirectory – 您的UserNamePasswordValidator可以有用户名和密码硬编码,或从文本文件,MySQL或其他)读取它。
- HTTPS
- IIS7
- .net 4.0
我的网站是通过DotNetPanel进行pipe理的。 它有3个虚拟目录安全选项:
- 允许匿名访问
- 启用基本authentication
- 启用集成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限制。