HTTP请求未经客户authenticationscheme“Ntlm”

在调用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> 

好的,下面是一些想到的事情:

  • 您大概在IIS上运行的WCF服务必须在具有调用Web服务权限的安全上下文中运行。 您需要在应用程序池中确保用户是域用户,理想情况下是专用用户。
  • 您不能使用模拟来使用用户的安全令牌使用模拟传递回ASMX,因为my WCF web service calls another ASMX web service, installed on a **different** web server
  • 尝试将Ntlm更改为Windows并再次测试。

好的,冒充几句话。 基本上这是一个已知的问题,你不能使用你到一台服务器的模拟令牌传递给另一台服务器。 原因似乎是,令牌是一种使用用户密码的哈希,对生成的机器有效,所以不能从中间服务器使用。


UPDATE

可以在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