部署至服务器的Azure函数无法携带Authorization头发送HTTP请求
1 重定向导致授权头丢失(最高概率)
HttpClient默认开启自动重定向,当目标接口返回301/302跳转响应时,为了避免授权信息泄露到非信任站点,会自动移除后续跳转请求的Authorization头。本地运行时通常直接请求目标地址无跳转,生产环境大概率配置了HTTP强制跳转HTTPS、或者域名迁移跳转,就会触发该逻辑。
解决方案:
- 优先直接将
configObj.Url修改为最终的HTTPS地址,从根源避免跳转 - 若必须处理跳转,手动关闭自动重定向,自行控制跳转逻辑:
// 初始化时自定义HttpClientHandler var handler = new HttpClientHandler { AllowAutoRedirect = false }; HttpClient client = new HttpClient(handler); // 原有授权头、BaseAddress配置保持不变
收到3xx响应后,手动提取response.Headers.Location地址,复用现有HttpClient实例发起新请求,授权头会自动携带。
2 中间链路过滤请求头
生产环境通常会在目标服务前部署WAF、API网关、反向代理等组件,若这类组件配置了请求头白名单,未将Authorization头纳入允许传递的范围,会直接丢弃该请求头。
解决方案:
在目标服务侧打印所有接收的请求头,确认是否是中间链路丢失了Authorization头,确认后联系运维调整对应组件的规则,放开Authorization头的传递限制。
3 Azure Function运行时配置问题
若部署的是Azure Functions服务,需检查host.json配置是否存在请求头过滤规则,代理功能也可能默认过滤敏感头。
解决方案:
修改host.json的HTTP扩展配置,清空排除头列表:
{ "extensions": { "http": { "headers": { "exclude": [] } } } }
4 请求路径拼接错误
BaseAddress结尾如果没有斜杠,而GetAsync的路径以斜杠开头时,会自动覆盖BaseAddress的路径部分。比如BaseAddress为https://test.com/service/,请求路径为/reports/xxx,最终拼接的地址为https://test.com/reports/xxx,会丢失/service/路径,若生产环境的服务部署在子路径下,就会请求到错误的地址返回401。
解决方案:
- 给
BaseAddress结尾添加斜杠:client.BaseAddress = new Uri(configObj.Url.TrimEnd('/') + "/"); - 移除请求路径的开头斜杠:
await client.GetAsync($"reports/{VariableValue}")
5 编码兼容问题
当前使用Encoding.ASCII编码账号密码,若生产环境的账号密码包含中文、特殊符号等非ASCII字符,会出现编码错误,导致生成的Authorization头无效,看起来类似头丢失。
解决方案:
将编码替换为UTF8:
var byteArray = Encoding.UTF8.GetBytes(configObj.loginId + ":" + configObj.password);
内容的提问来源于stack exchange,提问作者Vijay

