HTTP请求未经授权使用客户端身份validation方案’Ntlm’。 从服务器收到的身份validation标头是“Negotiate,NTLM”

我查看了大量的SO文章,甚至是其他网站,但似乎无法使这项服务正常运行。 我有一个我想要点击的SOAP服务,它的配置如下:

              

但是,从我的控制台应用程序中点击它时出现以下错误:

HTTP请求未经授权使用客户端身份validation方案’Ntlm’。 从服务器收到的身份validation标头是“Negotiate,NTLM”。

有人可以帮帮我吗?

您可以使用wftech消除客户端问题,这是一个旧工具,但我发现它在诊断身份validation问题时很有用。 wfetch允许您指定NTLM,Negotiate和kerberos,这可能会帮助您更好地理解您的问题。 当您尝试调用服务并且wfetch对WCF一无所知时,我建议将端点绑定(PROVIDERSSoapBinding)应用于serviceMetadata,然后您可以使用相同的安全设置对服务执行WSDL的HTTP GET。

您可以使用的另一个选项是强制服务器使用NTLM,您可以通过编辑元数据库(IIS 6)并删除Negotiate设置来执行此操作,有关详细信息,请访问http://support.microsoft.com/ kb / 215383 。

如果您使用的是IIS 7.x,则方法略有不同,有关如何配置身份validation提供程序的详细信息,请访问http://www.iis.net/configreference/system.webserver/security/authentication/windowsauthentication 。

我注意到你用xxx.xx.xx.xxx阻止了服务器地址,所以我猜这是一个IP地址而不是服务器名称,这可能会导致身份validation问题,所以如果可能的话尝试瞄准机器名称。

对不起,我没有给你答案,而是更接近问题的指示,但我希望它有所帮助。

我最后说我遇到了同样的问题而且我唯一的办法就是使用Kerberos而不是NTLM,不要忘记如果你沿着这条路走下去,你需要为服务注册一个SPN。

尝试将’clientCredentialType’设置为’Windows’而不是’Ntlm’。

我认为这就是服务器所期望的 – 即当它说服务器期望“Negotiate,NTLM”时,实际上意味着Windows Auth,它将尝试使用Kerberos(如果可用),或者如果没有则返回NTLM(因此’谈判’)

我的基础是在以下几行之间进行阅读: 选择凭证类型

我们遇到了这个问题,并发现在使用(在我们的例子中是IE)浏览器作为进程帐户登录时,然后通过应用程序(SharePoint)更改会话登录时会抛出错误。 我相信这种情况通过两种认证方案:

  1. 谈判
  2. NTLM

该应用程序托管了一个* .asmx Web服务,该服务在负载平衡服务器上调用,使用类似WCF的.NET3.5绑定启动对自身的Web服务调用。

用于调用Web服务的代码:

 public class WebServiceClient : IDisposable { private readonly T _channel; private readonly IClientChannel _clientChannel; public WebServiceClient(string url) : this(url, null) { } ///  /// Use action to change some of the connection properties before creating the channel ///  public WebServiceClient(string url, Action init) { var binding = new CustomBinding(); binding.Elements.Add( new TextMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8)); var transport = url.StartsWith("https", StringComparison.InvariantCultureIgnoreCase) ? new HttpsTransportBindingElement() : new HttpTransportBindingElement(); transport.AuthenticationScheme = System.Net.AuthenticationSchemes.Ntlm; binding.Elements.Add(transport); var address = new EndpointAddress(url); var factory = new ChannelFactory(binding, address); factory.Credentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; if (init != null) { init(binding, transport, address, factory); } this._clientChannel = (IClientChannel)factory.CreateChannel(); this._channel = (T)this._clientChannel; } ///  /// Use this property to call service methods ///  public T Channel { get { return this._channel; } } ///  /// Use this porperty when working with /// Session or Cookies ///  public IClientChannel ClientChannel { get { return this._clientChannel; } } public void Dispose() { this._clientChannel.Dispose(); } } 

我们发现如果会话凭证与浏览器的进程帐户相同,那么只使用NTLM并且调用成功。 否则会导致捕获到的exception:

HTTP请求未经授权使用客户端身份validation方案’Ntlm’。 从服务器收到的身份validation标头是“Negotiate,NTLM”。

最后,我相当确定其中一种身份validation方案将通过身份validation而另一种身份validation方案不会,因为它未被授予适当的访问权限。

您需要将NTAuthenticationProviders设置为NTLM

MSDN文章: https : //msdn.microsoft.com/en-us/library/ee248703(VS.90).aspx

IIS命令行( http://msdn.microsoft.com/en-us/library/ms525006(v=vs.90).aspx ):

  cscript adsutil.vbs set w3svc/WebSiteValueData/root/NTAuthenticationProviders "NTLM" 

如果您的客户端和服务都安装在同一台计算机上 ,并且您正在使用正确的(读取:在其他地方尝试过并尝试过)客户端和服务配置来解决此问题,那么这可能值得检查。

检查主机文件中的主机条目

%WINDIR%/ SYSTEM32 /司机/ etc / hosts文件

检查您是否使用主机名访问Web服务,并且相同的主机名已与上述hosts文件中的IP地址相关联。 如果是,则不会将NTLM / Windows凭据从客户端传递到服务,因为对该主机名的任何请求将在计算机级别再次路由。

请尝试以下任一操作

  • 从hosts文件中删除该主机名的主机条目
  • 要么

  • 如果无法删除主机条目,请尝试使用其他主机名访问您的服务。 您也可以尝试使用IP地址而不是主机名

编辑:不知何故上述情况与负载均衡的情况有关。 但是,如果无法删除主机条目,则禁用机器上的环回检查将有所帮助。 请参阅文章https://support.microsoft.com/en-us/kb/896861中的方法2