You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨.NET应用调用自研C# WebService遭遇NTLM认证未授权错误

解决WebService调用时的NTLM认证错误&配置AD内网访问方案

问题根源分析

你遇到的错误The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'NTLM',核心是客户端和服务器的认证方案不匹配:

  • 你在web.config里设置了<authentication mode="None"/>,但实际承载WebService的IIS很可能开启了**Windows认证(NTLM)**却没关闭,导致服务器强制要求NTLM认证;
  • 浏览器调用时会自动用当前登录用户的NTLM凭证,所以能正常访问;但你的.NET客户端默认用匿名方式请求,没携带NTLM凭证,因此被服务器拒绝。

第一步:先解决当前的认证不匹配错误

如果暂时不想切换到AD认证,先让客户端能正常调用,你需要确保服务器和客户端的认证方案统一:

  1. 检查并修改IIS认证设置:

    • 打开IIS管理器,找到你的WebService站点;
    • 进入「认证」功能,确保匿名认证处于启用状态,Windows认证处于禁用状态;
    • 这样服务器会遵循web.config的mode="None"设置,允许匿名访问。
  2. 客户端配置(保持匿名):
    确保客户端的配置里没有强制使用其他认证方式,默认匿名即可,无需额外调整。


第二步:配置AD服务器认证(仅限内网访问)

如果你的目标是限制仅内网AD用户访问,那需要调整为基于AD的Windows认证,具体步骤如下:

1. 修改WebService的web.config

<system.web>
  <!-- 切换为Windows认证,基于AD体系 -->
  <authentication mode="Windows" />
  <!-- 配置授权规则,仅允许指定AD用户/组访问 -->
  <authorization>
    <!-- 替换为你的内网AD组,比如DOMAIN\Internal_Users -->
    <allow roles="你的域名\内网用户组" />
    <!-- 拒绝所有匿名用户 -->
    <deny users="?" />
  </authorization>
  <compilation debug="true" targetFramework="4.5.2"/>
  <httpRuntime targetFramework="4.5"/>
</system.web>

2. 配置IIS认证与访问限制

  • 回到IIS的「认证」功能,禁用匿名认证,启用Windows认证;
  • 若要更严格限制内网访问,可结合IIS的「IP地址和域限制」功能,只允许内网IP段的请求进入。

3. 配置.NET客户端调用

客户端需要携带AD凭证访问,在客户端的app.config/web.config里添加服务绑定配置:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="WebServiceBinding">
        <security mode="TransportCredentialOnly">
          <!-- 使用Windows认证,自动携带当前用户AD凭证 -->
          <transport clientCredentialType="Windows" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint 
      address="http://你的WebService地址/Service.asmx"
      binding="basicHttpBinding"
      bindingConfiguration="WebServiceBinding"
      contract="你的服务引用命名空间.服务契约名" />
  </client>
</system.serviceModel>

如果客户端是桌面应用,默认会使用当前登录用户的AD身份,无需额外输入账号密码;如果是服务端应用,可能需要指定特定AD账号:

// 客户端代码中指定AD凭证
var client = new YourServiceReference.YourServiceClient();
client.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("用户名", "密码", "域名");

额外注意事项

  • 如果内网环境支持Kerberos认证,建议优先启用(IIS里Windows认证可设置启用Kerberos),比NTLM更安全;但需要为WebService的应用池账号注册SPN(服务主体名称),否则可能出现Kerberos认证失败的问题;
  • 测试时可以先用域账号登录内网机器,直接调用服务,验证是否能正常访问。

内容的提问来源于stack exchange,提问作者G. Manucci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:50