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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:42:26