HTTP 请求未经客户端身份验证方案“Ntlm”授权
Posted
技术标签:
【中文标题】HTTP 请求未经客户端身份验证方案“Ntlm”授权【英文标题】:The HTTP request is unauthorized with client authentication scheme 'Ntlm' 【发布时间】:2011-06-22 15:19:19 【问题描述】:调用网络服务时出现以下错误:
HTTP 请求未经客户端身份验证方案“NTLM”授权。从服务器收到的身份验证标头是“NTLM”。 HTTP 请求未经客户端身份验证方案“NTLM”授权。从服务器收到的身份验证标头是“NTLM”。
我的 IIS (7) 上有一个调用 WCF Web 服务的 Silverlight 4 应用程序。 我的 WCF Web 服务使用 NTLM(Windows 身份验证)调用另一个安装在不同 Web 服务器上的 ASMX Web 服务。 我的服务器和托管 ASMX Web 服务的服务器都在同一个域中。
当 Silverlight 客户端使用 http://localhost/MySiteName
从服务器打开应用程序时,一切正常。但是,当 Silverlight 客户端使用 http://MyServerName/MySiteName
从不同的客户端(不是服务器但仍在同一个域中)打开应用程序时,我会收到错误消息。
在我的 IIS 中启用了 Windows 身份验证。 我的 IIS 中禁用了匿名身份验证。
调用我的 WCF Web 服务的绑定配置是:
<binding name="winAuthBasicHttpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
调用ASMX web服务的绑定配置为:
<binding name="ClNtlmBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
</binding>
【问题讨论】:
调用我的 WCF web 服务的绑定配置是:好的,下面是我想到的:
您可能在 IIS 上运行的 WCF 服务必须在具有调用 Web 服务的权限的安全上下文中运行。您需要确保应用程序池中的用户是域用户 - 最好是专用用户。 由于my WCF web service calls another ASMX web service, installed on a **different** web server
,您不能使用模拟来使用用户的安全令牌通过模拟传递回 ASMX
尝试将Ntlm
更改为Windows
并再次测试。
好的,关于模仿的几句话。 基本上这是一个已知问题,您不能使用您在一台服务器上获得的模拟令牌传递给另一台服务器。原因似乎是令牌是一种使用用户密码的哈希,并且对从中生成的机器有效,因此不能从中间服务器使用。
更新
委托在 WCF 下是可能的(即将模拟从一个服务器转发到另一个服务器)。看这个话题here。
【讨论】:
谢谢。当我将域用户设置为应用程序池时,它运行良好,但现在我对 WS 的所有调用都在应用程序池域用户下执行。我不能使用模拟调用 ASMX ws,所以调用是在客户端的用户安全令牌下执行的? 顺便说一句,我忘了提到当使用特定用户(登录到客户端的同一用户)模拟时,一切正常:client = new ClCustomersServiceClient(); client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain"); response = client.ClCustomersQuery(request); 好吧,您在 WCF 服务器上使用用户名密码来模拟 ASMX 服务器。这是可能的,但您无法通过用于获取 WCF 的 Windows 身份验证,以获取 ASMX。 Aliostad - 感谢您的帮助。【参考方案2】:问题发布已经很长时间了,但我在类似的情况下遇到了同样的问题。我有一个控制台应用程序,我正在使用一个 Web 服务,并且放置该 Web 服务的 IIS 服务器启用了 Windows 身份验证 (NTLM)。
我关注了this link,这解决了我的问题。这是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>
【讨论】:
【参考方案3】:对我来说,除了使用“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;
【讨论】:
【参考方案4】:我不得不移动域、用户名、密码
client.ClientCredentials.UserName.UserName = 域 + "\\" + 用户名; client.ClientCredentials.UserName.Password = 密码
到
client.ClientCredentials.Windows.ClientCredential.UserName = 用户名; client.ClientCredentials.Windows.ClientCredential.Password = 密码; client.ClientCredentials.Windows.ClientCredential.Domain = 域;
【讨论】:
这也适用于我用于 .NetCore 项目的 s-s-rS asmx 服务之一【参考方案5】:1) 我必须对我的配置执行以下操作:(添加 BackConnectionHostNames 或禁用环回检查) http://support.microsoft.com/kb/896861
2) 我正在一个隔离的开发网络上开发一个开发系统。我已经在 Web 服务的 URL 中使用开发系统的计算机名称使其工作,但是当我将 URL 修改为将在生产中使用的 URL(而不是计算机名称)时,我开始收到 NTLM 错误。
3) 我注意到安全日志显示服务帐户无法登录,并出现类似于 MSDN 文章中的错误。
4) 添加 BackConnectionHostNames 使我可以通过服务器上运行的浏览器登录服务器,但在尝试对 Web 服务进行身份验证时,服务帐户仍然出现 NTLM 错误。我最终禁用了环回检查并为我修复了它。
【讨论】:
【参考方案6】:也许你可以参考:http://msdn.microsoft.com/en-us/library/ms731364.aspx 我的解决方案是更改 2 个属性 authenticationScheme 和 proxyAuthenticationScheme 到“Ntlm”,然后它就可以工作了。
PS:我的环境如下 - 服务器端:.net 2.0 ASMX - 客户端:.net 4
【讨论】:
【参考方案7】:我的问题是; 没有管理员用户在我的 asmx 服务上收到“使用客户端身份验证方案 'negotiate' asmx 未经授权的 http 请求”。
我为非管理员用户授予了读取/执行文件夹权限,我的问题得到了解决。
【讨论】:
以上是关于HTTP 请求未经客户端身份验证方案“Ntlm”授权的主要内容,如果未能解决你的问题,请参考以下文章
HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“NTLM”
HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头是“协商,NTLM”
Sharepoint 2010 自定义 Web 服务 - HTTP 请求未经客户端身份验证方案“Ntlm”授权