#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 в теле запроса. Не получите никакого правильного решения.