[英]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.