HttpClient не отправляет токен носителя авторизации в .Net Core 3.1

#c# #asp.net #asp.net-web-api

#c# #asp.net #asp.net-web-api

Вопрос:

У меня есть ASP.NET Основное приложение MVC, которое вызывает ASP.NET Core WebAPI использует HttpClient, но я должен отправить заголовок авторизации, проблема в том, что мой 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);
        }
  

Для запросов, для которых не требуется заголовок авторизации, он работает довольно хорошо, но не отправляет заголовок авторизации, я попытался создать экземпляр нового HttClient, используя HttpRequestMessage, а затем SendAsync, но это никогда не работает, я также пытался использовать httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}"); , но он также не работает TryAddWithoutValidation , но не работает.
Хуже всего то, что когда я проверяю свой объект HttpClient, токен авторизации находится там:

введите описание изображения здесь

Но затем я получаю сообщение 401 от моего webapi, и когда я проверяю запрос, полученный в webapi, заголовок авторизации пуст, и мой webapi работает нормально, когда он получает запросы от вызовов ajax или таких приложений, как insomnia и postman.

Я не могу понять, чего мне не хватает.

Редактировать:

В моем webapi поступающий запрос: введите описание изображения здесь

Мой заголовок авторизации {}

Теперь, например, когда я получаю запрос от insomnia, у меня есть следующие заголовки:

введите описание изображения здесь

Комментарии:

1. Попробуйте добавить обработчик ведения журнала, как в этом примере: learn.microsoft.com/en-us/aspnet/web-api/overview/advanced /… таким образом, вы можете наблюдать необработанные свойства запроса

Ответ №1:

Используемый вами код выглядит так, как будто он должен работать, я попробовал что-то подобное со своей стороны, и он добавил 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).Resu<
  

Я могу подтвердить, что это, безусловно, добавляет JWT в качестве токена-носителя в заголовок (иначе это не сработало бы)

надеюсь, это поможет.

Комментарии:

1. Спасибо за ваш ответ. Я проверяю токен jwt, и он действителен, срок действия в порядке, и как только я предоставил секретный токен, он сказал, что подпись проверена. Я добавил изображения запросов, полученных от моего httpclient (asp.net ядро) и от бессонницы.

2. @AlefDuarte Я добавил обновление, в котором содержится точный код, который я использовал (который очень похож на ваш — это определенно добавление JWT в качестве токена предъявителя

3. Я все еще сталкиваюсь с той же проблемой, но поскольку ваш код должен работать, теперь я знаю, что это должна быть какая-то конфигурация, которую я пропускаю, а не то, как создается экземпляр httpclient. Спасибо за вашу помощь, если у меня будут какие-либо обновления, я дам вам знать.

4. Где ваши данные post. Я хочу отправить post-запрос с токеном-носителем и json в теле запроса. Не получите никакого правильного решения.