使用NTLM认证的HttpClient收到401响应无法获取200响应如何解决?
解决方案
1. 补全HttpClientHandler的NTLM认证配置
.NET Framework 4.6.1的HttpClientHandler默认不会主动启用NTLM协商逻辑,你需要显式配置认证相关参数,修正后的Handler初始化代码如下:
HttpClientHandler handler = new HttpClientHandler { Credentials = CredentialManager.GetCredentials(), PreAuthenticate = true, // 开启预认证,完成首次协商后后续请求可直接携带认证信息,避免重复走401流程 AllowAutoRedirect = true, // 允许自动跟随认证流程的响应跳转 // 显式指定支持的认证类型为NTLM和协商模式,兼容不同服务端的NTLM实现 AuthenticationSchemes = System.Net.AuthenticationSchemes.Ntlm | System.Net.AuthenticationSchemes.Negotiate, // 如果是使用当前Windows登录身份做认证,就把UseDefaultCredentials设为true,不需要单独赋值Credentials UseDefaultCredentials = false };
2. 确认凭证有效性
请检查CredentialManager.GetCredentials()返回的是有效的NetworkCredential类型实例:如果是域账户,用户名需要遵循域名\用户名的格式,不要只传用户名,同时密码、域名字段无空值。
3. 兼容SOAP请求规则(可选)
部分服务端的SOAP接口要求请求必须携带SOAPAction头,缺失也会触发401错误,可在发送请求前补充对应头信息:
client.DefaultRequestHeaders.Add("SOAPAction", "服务端定义的SOAPAction值"); soapMessage.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml; charset=utf-8");
4. 关闭100 Continue预期(可选)
旧版本IIS服务端处理NTLM认证时,经常会因为Expect: 100-continue请求头导致认证流程中断,可在应用启动时全局关闭该配置:
System.Net.ServicePointManager.Expect100Continue = false;
内容的提问来源于stack exchange,提问作者zynovij
相关产品推荐
相关产品推荐

