C# HTTP请求未经客户端身份验证方案';Ntlm&x27;

C# HTTP请求未经客户端身份验证方案';Ntlm&x27;,c#,.net,windows,silverlight,wcf,C#,.net,Windows,Silverlight,Wcf,调用web服务时,出现以下错误: HTTP请求未经客户端身份验证方案“NTLM”授权。从服务器接收的身份验证标头为“NTLM”。HTTP请求未经客户端身份验证方案“NTLM”授权。从服务器接收的身份验证标头为“NTLM” 我有一个Silverlight 4应用程序,它在我的IIS(7)上调用WCF web服务。 我的WCF web服务使用NTLM(Windows身份验证)调用另一个安装在不同web服务器上的ASMX web服务。 我的服务器和托管ASMX web服务的服务器都在同一个域中 当Si

调用web服务时,出现以下错误:

HTTP请求未经客户端身份验证方案“NTLM”授权。从服务器接收的身份验证标头为“NTLM”。HTTP请求未经客户端身份验证方案“NTLM”授权。从服务器接收的身份验证标头为“NTLM”

我有一个Silverlight 4应用程序,它在我的IIS(7)上调用WCF web服务。 我的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>
    <binding name="ClNtlmBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm" />
      </security>
    </binding>


调用ASMX web服务的绑定配置为:

    <binding name="winAuthBasicHttpBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
    <binding name="ClNtlmBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm" />
      </security>
    </binding>

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

  • 可能在IIS上运行的WCF服务必须在具有调用Web服务权限的安全上下文下运行。你需要确保在应用程序池中有一个域用户,最好是一个专用用户
  • 您不能使用模拟来使用用户的安全令牌通过模拟传回ASMX,因为
    my WCF web服务调用另一个安装在**不同**web服务器上的ASMX web服务
  • 尝试将
    Ntlm
    更改为
    Windows
    ,然后再次测试

好的,关于模仿的几句话。基本上,这是一个已知的问题,即您不能使用到一台服务器的模拟令牌传递到另一台服务器。原因似乎是令牌是一种使用用户密码的散列,对从生成的机器有效,因此不能从中间服务器使用


更新
委托可以在WCF下进行(即,将模拟从一台服务器转发到另一台服务器)。看看这个话题

问题发布已经有很长时间了,但我在类似的场景中遇到了同样的问题。我有一个控制台应用程序,我正在使用一个web服务,放置web服务的IIS服务器启用了windows身份验证(NTLM)

我照做了,这就解决了我的问题。下面是
App.config
的示例代码:


1)我必须对配置执行以下操作:(添加BackConnectionHostName或禁用环回检查)

2) 我在一个孤立的开发网络上开发一个开发系统。我在web服务的URL中使用了开发系统的计算机名,但当我将URL修改为将在生产中使用的URL(而不是计算机名)时,我开始出现NTLM错误

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

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

也许您可以参考: 我的解决方案是更改两个属性 authenticationScheme和proxyAuthenticationScheme转换为“Ntlm”,然后它就可以工作了

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

我必须从中移动域、用户名和密码

client.ClientCredentials.UserName.UserName=域+“\\”+用户名; client.ClientCredentials.UserName.Password=密码

client.ClientCredentials.Windows.ClientCredential.UserName=用户名; client.ClientCredentials.Windows.ClientCredential.Password=密码; client.ClientCredentials.Windows.ClientCredential.Domain=域


对我来说,解决方案除了使用“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;
    }  
我的问题是; 没有管理员用户在我的asmx服务上获得“http请求未经授权,客户端身份验证方案‘协商’asmx”


我为非管理员用户授予了读取/执行文件夹权限,问题得到了解决。

调用我的WCF web服务的绑定配置是:调用ASMX web服务的绑定配置是:谢谢。当我将一个域用户设置到应用程序池时,它工作得很好,但现在我对WS的所有调用都在应用程序池域用户下执行。我不能使用模拟来调用ASMX ws,所以调用是在客户端的用户安全令牌下执行的吗?顺便说一句,我忘记了在对特定用户(登录到客户端的同一用户)使用模拟时,一切都很好:client=new ClCustomersServiceClient();client.ClientCredentials.Windows.AllowedImpersonationLevel=System.Security.Principal.TokenImpersonationLevel.Impersonation;client.ClientCredentials.Windows.ClientCredential=新的网络凭据(“用户名”、“密码”、“域”);回应=