.NET 7.0 HttpClient 301重定向时未发送DefaultRequestHeaders问题咨询
HttpClient重定向时不发送DefaultRequestHeaders是预期行为
这不是Bug,是HttpClient的默认安全行为:当重定向到不同主机(域名)的URL时,HttpClient会自动移除Authorization等敏感请求头,防止将身份凭证泄露给未授权的第三方服务器。DefaultRequestHeaders的命名虽然带有“Default”,但它的作用是为同一主机的请求设置默认头,跨主机重定向时出于安全考量不会携带。
针对Microsoft Graph API 301重定向的解决方案
你的场景中,原API重定向到reportsweu.office.com域名,原令牌失效是因为:
- 原Bearer令牌的受众(
aud声明)通常仅包含graph.microsoft.com,而reportsweu.office.com属于不同的资源服务器,需要对应资源的权限令牌。
解决方法有两种:
1. 手动处理重定向(推荐)
关闭HttpClient的自动重定向,自行处理301响应,针对新URL获取对应令牌后发起请求:
var client = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false }); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", originalToken); var initialResponse = await client.GetAsync("https://graph.microsoft.com/v1.0/reports/getOffice365GroupsActivityDetail"); if (initialResponse.StatusCode == HttpStatusCode.MovedPermanently) { var targetUrl = initialResponse.Headers.Location; // 针对reportsweu.office.com获取新的访问令牌 var newToken = await AcquireTokenForResource("https://reportsweu.office.com/"); // 发起新请求 var finalRequest = new HttpRequestMessage(HttpMethod.Get, targetUrl); finalRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", newToken); var finalResponse = await client.SendAsync(finalRequest); // 处理响应内容 var content = await finalResponse.Content.ReadAsStringAsync(); }
2. 自定义重定向策略(谨慎使用)
如果需要保留自动重定向,可以自定义DelegatingHandler,允许在信任的域名下携带Authorization头,但注意仅针对已知安全的域名开放:
public class TrustedRedirectHandler : DelegatingHandler { private readonly HashSet<string> _trustedDomains = new HashSet<string> { "reportsweu.office.com" }; protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); if (response.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Redirect) { var targetUri = response.Headers.Location; if (targetUri != null && _trustedDomains.Contains(targetUri.Host)) { var followRequest = new HttpRequestMessage(request.Method, targetUri); // 复制原请求的Authorization头 followRequest.Headers.Authorization = request.Headers.Authorization; // 复制其他需要的默认头 foreach (var header in request.Headers) { followRequest.Headers.TryAddWithoutValidation(header.Key, header.Value); } return await base.SendAsync(followRequest, cancellationToken); } } return response; } } // 使用方式 var client = new HttpClient(new TrustedRedirectHandler { InnerHandler = new HttpClientHandler() }); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", originalToken);
关键说明
- 不要随意修改默认的重定向安全策略,避免将敏感凭证发送到未知域名。
- Microsoft Graph的报告API重定向到专用域名是正常设计,需要确保你的应用权限包含该资源的访问范围。
内容的提问来源于stack exchange,提问作者whatever
相关产品推荐
相关产品推荐

