在调用Web服务时,出现以下错误:
HTTP请求未经客户authenticationscheme“NTLM”授权。 从服务器收到的validation头是“NTLM”。 HTTP请求未经客户authenticationscheme“NTLM”授权。 从服务器收到的validation头是“NTLM”。
我有一个调用WCF Web服务的Silverlight 4应用程序,都在我的IIS(7)上。 我的WCF Web服务使用NTLM(Windows身份validation)调用安装在其他Web服务器上的另一个ASMX Web服务。 这两个服务器,我的和ASMX Web服务的主机都在同一个域中。
当Silverlight客户端使用http://localhost/MySiteName
从服务器打开应用程序时,一切正常。 但是,当Silverlight客户端使用http://MyServerName/MySiteName
从不同服务器(不是服务器,但仍在同一个域中)打开应用程序时, http://MyServerName/MySiteName
出现错误。
Windows身份validation在我的IIS中启用。 匿名身份validation在我的IIS中被禁用。
用于调用我的WCF Web服务的绑定configuration是:
<binding name="winAuthBasicHttpBinding"> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" /> </security> </binding>
调用ASMX Web服务的绑定configuration是:
<binding name="ClNtlmBinding"> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" /> </security> </binding>
好的,下面是一些想到的事情:
my WCF web service calls another ASMX web service, installed on a **different** web server
Ntlm
更改为Windows
并再次测试。 好的,冒充几句话。 基本上这是一个已知的问题,你不能使用你到一台服务器的模拟令牌传递给另一台服务器。 原因似乎是,令牌是一种使用用户密码的哈希,对生成的机器有效,所以不能从中间服务器使用。
可以在WCF下委托 (例如,将服务器的模拟转发到另一台服务器)。 在这里看这个话题。
问题发布已经很长时间了,但是在类似的情况下我遇到了同样的问题。 我有一个控制台应用程序,我正在使用Web服务,我们的IIS服务器放置了web服务,并启用了Windows身份验证(NTLM)。
我跟着这个链接,并解决了我的问题。 以下是App.config
的示例代码:
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="Service1Soap"> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm=""/> <message clientCredentialType="UserName" algorithmSuite="Default"/> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost/servicename/service1.asmx" binding="basicHttpBinding" bindingConfiguration="ListsSoap"/> </client> </system.serviceModel>
对我来说,解决方案除了使用“Ntlm”作为凭证类型外,与Jeroen K的解决方案类似。 如果我有权限级别,我会加上他的帖子,但让我发布我的整个代码,这将支持Windows和其他凭据类型,如基本身份验证:
XxxSoapClient xxxClient = new XxxSoapClient(); ApplyCredentials(userName, password, xxxClient.ClientCredentials); private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials) { clientCredentials.UserName.UserName = userName; clientCredentials.UserName.Password = password; clientCredentials.Windows.ClientCredential.UserName = userName; clientCredentials.Windows.ClientCredential.Password = password; clientCredentials.Windows.AllowNtlm = true; clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; }
我不得不移动域名,用户名,密码
client.ClientCredentials.UserName.UserName = domain +“\\”+ username; client.ClientCredentials.UserName.Password =密码
至
client.ClientCredentials.Windows.ClientCredential.UserName = username; client.ClientCredentials.Windows.ClientCredential.Password = password; client.ClientCredentials.Windows.ClientCredential.Domain = domain;
1)我必须做我的配置以下内容:(添加BackConnectionHostNames或禁用回送检查) http://support.microsoft.com/kb/896861
2)我正在孤立的开发网络上开发一个开发系统。 我已经使用开发系统的计算机名称在Web服务的URL中工作了,但是当我修改URL到生产中使用的URL(而不是计算机名)时,我开始得到NTLM错误。
3)我注意到安全日志显示服务帐户登录失败,类似于MSDN文章中的错误。
4)添加BackConnectionHostNames使得我可以通过运行在服务器上的浏览器登录到服务器,但是当尝试验证Web服务时,服务帐户仍然存在NTLM错误。 我结束了禁用循环检查,并修复了我。
也许你可以参考: http : //msdn.microsoft.com/en-us/library/ms731364.aspx我的解决方案是更改2属性authenticationScheme和proxyAuthenticationScheme为“Ntlm”,然后它的工作原理。
PS:我的环境如下 – 服务器端:.net 2.0 ASMX – 客户端:.net 4