HTTP请求未经授权使用客户端身份验证方案'Ntlm'

时间:2011-02-07 09:55:10

标签: c# .net windows silverlight wcf

在调用Web服务时,我收到以下错误:

  

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>

7 个答案:

答案 0 :(得分:18)

好的,这是我想到的事情:

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

好的,有关假冒的几句话。 基本上,一个已知的问题是,您无法使用到一台服务器的模拟令牌传递给另一台服务器。原因似乎是令牌是一种使用用户密码的哈希,对于生成的机器有效,因此无法从中间服务器使用。


更新

委派在WCF下是可能的(即将模拟从服务器转发到另一台服务器)。请看这个主题here

答案 1 :(得分:7)

问题发布后已经很长时间了,但在类似的情况下我遇到了同样的问题。我有一个控制台应用程序,我正在使用Web服务,我的IIS服务器放置了web服务,启用了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>

答案 2 :(得分:4)

对我来说,解决方案除了使用&#34; Ntlm&#34;作为凭证类型,类似于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;
    }  

答案 3 :(得分:3)

我必须从

移动域名,用户名和密码
  

client.ClientCredentials.UserName.UserName = domain +“\\”+ username;      client.ClientCredentials.UserName.Password = password

  

client.ClientCredentials.Windows.ClientCredential.UserName = username;   client.ClientCredentials.Windows.ClientCredential.Password = password;   client.ClientCredentials.Windows.ClientCredential.Domain = domain;

答案 4 :(得分:0)

1)我必须使用我的配置执行以下操作:(添加BackConnectionHostNames或禁用环回检查) http://support.microsoft.com/kb/896861

2)我正在一个孤立的开发网络上开发一个开发系统。我使用开发系统的计算机名称在Web服务的URL中使用它,但是当我将URL修改为将在生产中使用的URL(而不是计算机名称)时,我开始收到NTLM错误。 / p>

3)我注意到安全日志显示服务帐户无法登录,其错误类似于MSDN文章中的错误。

4)添加BackConnectionHostNames使我可以通过服务器上运行的浏览器登录服务器,但是在尝试对Web服务进行身份验证时,服务帐户仍然存在NTLM错误。我结束了禁用循环检查并为我修复它。

答案 5 :(得分:0)

也许你可以参考:http://msdn.microsoft.com/en-us/library/ms731364.aspx 我的解决方案是更改2个属性 authenticationScheme和proxyAuthenticationScheme为“Ntlm”,然后它可以工作。

PS:我的环境如下   - 服务器端:.net 2.0 ASMX   - 客户方:.net 4

答案 6 :(得分:0)

我的问题是; 没有管理员用户在我的asmx服务上收到“使用客户端身份验证方案'negotiate'asmx对http请求进行了未经授权的访问。”

我为没有管理员的用户授予了读取/执行文件夹的权限,而我的问题已解决。