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

.NET Core 3.1中HttpClient无法设置Authorization头问题排查

问题出在AuthenticationHeaderValue的参数传值上!

嘿,我一眼就揪出你代码里的问题啦——你创建AuthenticationHeaderValue的时候把参数搞混了!

你现在写的代码是:

httpClient.DefaultRequestHeaders.Authorization=new AuthenticationHeaderValue("Authorization",$"Bearer {token}");

这里的第一个参数应该是认证方案(Scheme),也就是"Bearer",而不是请求头的名称"Authorization"。HttpClient会自动把这个头命名为Authorization,格式是Scheme Parameter,你这么写相当于把Scheme设成了Authorization,参数设成了Bearer {token},完全不符合JWT授权头的规范,自然不会被系统识别,甚至调试时都看不到正确的Authorization头。

正确的两种写法:

方式1:用AuthenticationHeaderValue(推荐)

直接把Scheme设为Bearer,参数传token本身即可:

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

方式2:直接添加请求头(你注释掉的那行其实是对的)

如果想用Add方法,直接指定头名称和完整的Bearer字符串:

httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");

修正后的完整测试方法:

[Fact]
public async void InvalidId_UnSuccessFull_GetById() {
    // Arrange
    var httpClient = new HttpClient();
    var token = await GetAdminAccessToken(); // 发送登录请求获取有效令牌
    // 这里用正确的方式设置授权头
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    var id = Guid.Empty;
    // Act
    var response = await httpClient.GetAsync($"localhost:5000/Admin/User/{id}"); // 注意补上字符串插值符号$
    var message = await ExtractMessage(response);
    // Assert
    Assert.Contains(PersianErrorMessage.InvalidUserId, message);
    Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
}

哦对了,顺便提个小细节:你原来的GetAsync路径里的{id}没做字符串插值,得加上$符号,不然请求的路径会直接带{id}字符串,这也会导致请求异常,虽然和授权问题无关,但也是个容易踩的坑!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:17:32