.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
相关产品推荐
相关产品推荐

