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 服务的绑定配置是: 调用 ASMX Web 服务的绑定配置为: 【参考方案1】:

好的,下面是我想到的:

您可能在 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”授权

HTTP 请求未经客户端身份验证方案“匿名”授权。使用 wsdl 文件

异常 = HTTP 请求未经客户端身份验证方案“匿名”授权

客户端身份验证方案“匿名”的 HTTP 请求未经授权?