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

Azure应用网关未传递NTLM认证头至后端池问题求助

解决Azure应用网关未传递NTLM认证头导致.NET Core客户端调用未授权的问题

这是个典型的Azure应用网关与NTLM认证兼容的问题,我帮你梳理下核心原因和解决方案:

核心问题拆解

你遇到的情况本质上是两点:

  • Azure应用网关默认不会主动透传NTLM认证所需的Authorization头(尤其是包含NTLM挑战/响应的会话相关头信息)
  • Postman/Insomnia这类工具会直接处理完整的NTLM握手流程并正确维护头信息,但.NET Core HttpClient的默认配置没有适配网关的会话亲和要求,导致认证头无法被正确传递到后端IIS服务

分步解决方案

1. 调整Azure应用网关的关键设置

首先要确保网关能正确处理NTLM的会话关联和头透传:

  • 进入Azure门户的应用网关资源,找到对应后端池的路由规则,启用会话亲和性并选择Cookie-based affinity(NTLM认证是绑定到单个后端VM的,必须让网关把同一客户端的请求路由到同一服务器)
  • 打开后端池的HTTP设置:
    • 确保没有在“请求头”配置中移除Authorization头
    • 开启保持活动(Keep-Alive)设置,NTLM认证需要持久连接才能完成完整的握手流程
    • 确认“后端协议”与后端IIS的配置匹配(HTTPS/HTTP)

2. 修改.NET Core客户端的认证配置

.NET Core HttpClient的默认处理逻辑需要调整,以适配网关的NTLM透传要求,以下是优化后的代码示例:

// 配置HttpClientHandler以支持NTLM认证和持久连接
var handler = new HttpClientHandler
{
    UseDefaultCredentials = true, // 使用当前登录用户的凭据,也可以替换为指定的NetworkCredential
    PreAuthenticate = true, // 提前发送认证头,避免等待401挑战
    AllowAutoRedirect = false, // 禁用自动重定向,防止重定向丢失认证信息
    KeepAlive = true // 启用保持活动连接,匹配网关设置
};

// 如果你需要使用特定域账号认证,替换上面的UseDefaultCredentials:
// handler.Credentials = new NetworkCredential("your-username", "your-password", "your-domain");

var client = new HttpClient(handler);
// 添加保持连接的请求头,确保网关不会中断连接
client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");

// 处理上传请求
var content = new MultipartFormDataContent();
// 添加你的上传文件和其他参数
content.Add(new StreamContent(File.OpenRead("your-file-path")), "file", "filename.ext");

var response = await client.PostAsync("https://your-gateway-endpoint/upload", content);

// 处理可能的401挑战:如果第一次请求返回未授权,手动触发NTLM响应
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
    var ntlmChallenge = response.Headers.WwwAuthenticate.FirstOrDefault(h => h.Scheme.Equals("NTLM", StringComparison.OrdinalIgnoreCase));
    if (ntlmChallenge != null)
    {
        // 重新发送请求,此时Handler会自动添加NTLM响应头
        response = await client.PostAsync("https://your-gateway-endpoint/upload", content);
    }
}

// 后续处理响应
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();

3. 验证后端IIS的NTLM配置

最后确认后端VM的IIS设置没有问题:

  • 站点的身份验证模块中,禁用匿名认证,仅启用Windows身份验证(并确保NTLM是优先的认证方案)
  • 检查应用程序池的身份,确保它有足够的权限访问上传目录和处理请求
  • 确认IIS已安装“Windows身份验证”扩展(如果没装,需要通过服务器管理器添加)

关键注意事项

  • NTLM依赖会话上下文:必须确保网关的会话亲和性开启,否则请求被分发到不同后端VM会导致认证失败
  • 持久连接是核心:网关和客户端都必须启用Keep-Alive,否则NTLM握手会被中断
  • PreAuthenticate的作用:开启后会在第一次请求就发送认证信息,避免网关在处理401挑战时丢失头信息

内容的提问来源于stack exchange,提问作者Nabeel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:27:38