[英]HttpClient not sending authorization Bearer token in .Net Core 3.1
我有一个 ASP.NET Core MVC 应用程序,它使用 HttpClient 调用 ASP.NET Core WebApi,但我必须发送授权标头,问题是我的 HttpClient 不会发送授权标头。
我有一个用于调用具有以下构造函数的 webapi 的服务:
public ApiService(HttpClient httpClient, IHttpContextAccessor accessor)
{
string token = accessor.HttpContext.User.FindFirstValue("JWToken"); // gets user token
httpClient.BaseAddress = new Uri(AppSettings.BaseUrlApi); //sets the base URL of the webapi
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
httpClient.Timeout = TimeSpan.FromMinutes(1);
httpClient.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", token);
_httpClient = httpClient; // assigns to a private property "private readonly HttpClient _httpClient;"
}
然后,当我将数据发布到 webapi 时,我使用以下方法:
public async Task<User> PostAsync(string url, User user)
{
StringContent jsonContent = new StringContent(
JsonConvert.SerializeObject(user, Formatting.Indented, _jsonSettings), // _jsonSettings is a JsonSerializerSettings object
Encoding.UTF8,
"application/json");
using HttpResponseMessage httpResponse =
await _httpClient.PostAsync(url, jsonContent);
httpResponse.EnsureSuccessStatusCode();
string responseString = await httpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<User>(responseString, _jsonSettings);
}
对于不需要 Authorization 标头的请求,它工作得很好,但它不发送 Authorization 标头,我尝试实例化一个新的 HttClient,使用 HttpRequestMessage 然后 SendAsync,但它从来没有工作,我也尝试过使用httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
但它不起作用,也TryAddWithoutValidation
,但不起作用。 最糟糕的是,当我检查我的 httpClient 对象时,授权令牌在那里:
但是后来我从我的 webapi 收到一条 401 消息,当我检查在 webapi 中收到的请求时,授权标头是空的,当它收到来自 ajax 调用或 insomnia 和 postman 等应用程序的请求时,我的 webapi 工作正常。
我无法弄清楚我错过了什么。
编辑:
我的授权标头是 {}
现在,当我收到来自 insomnia 的请求时,例如,我有以下标头:
您使用的代码看起来应该可以工作,我尝试了类似的方法,并按预期添加了 JWT。 401 是否有可能合法地指代错误的令牌? 我会尝试使用以下方法对其进行解码: https : //jwt.io/并验证其中的所有声明是否合理(例如过期)并且是否已正确签名。
添加一些与您正在尝试做的对我有用的代码非常相似,仅供参考,这是通过 API 拨打电话,为了简单起见,将 JWT 生成和命令生成排除在外
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
var json = JsonConvert.SerializeObject(command,
Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
httpClient.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", jwt);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = httpClient.PostAsync("https://api.nexmo.com/v1/calls", content).Result;
我可以确认这肯定会将 JWT 作为不记名令牌添加到标头中(否则将无法正常工作)
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.