簡體   English   中英

HttpClient 未在 .Net Core 3.1 中發送授權承載令牌

[英]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 工作正常。

我無法弄清楚我錯過了什么。

編輯:

在我的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM