跨.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认证,先让客户端能正常调用,你需要确保服务器和客户端的认证方案统一:
检查并修改IIS认证设置:
- 打开IIS管理器,找到你的WebService站点;
- 进入「认证」功能,确保匿名认证处于启用状态,Windows认证处于禁用状态;
- 这样服务器会遵循web.config的
mode="None"设置,允许匿名访问。
客户端配置(保持匿名):
确保客户端的配置里没有强制使用其他认证方式,默认匿名即可,无需额外调整。
第二步:配置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
相关产品推荐
相关产品推荐

