#c# #asp.net #oauth #identityserver3 #openid-connect
#c# #asp.net #oauth #identityserver3 #OpenID-connect
Вопрос:
Насколько я понимаю, HttpClient был разработан для создания один раз и повторного использования. Я использую IdentityServer3 в качестве сервера OIDC / OAuth, и примеры, которые я рассмотрел, создают HttpClient для каждого запроса и устанавливают токен-носитель с использованием метода расширения:
var client = new HttpClient();
client.SetBearerToken(token);
SetBearerToken просто устанавливает заголовок авторизации по умолчанию для HttpClient:
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
У меня есть ASP.NET веб-приложение, вызывающее ASP.NET Веб-API, и я настроил их так, чтобы идентификация клиента передавалась в API при выполнении вызова, т.е. При настройке аутентификации OpenID connect я устанавливаю:
OpenIdConnectAuthenticationOptions.ResponseType = "id_token token"
Однако, если в токене передается требование субъекта, я теперь не могу повторно использовать HttpClient (например, заголовок авторизации запроса может быть перезаписан до его отправки другим запросом).
Если я хочу повторно использовать HttpClient, должен ли я устанавливать токен в HttpRequestMessage? Если нет, то какой рекомендуемый шаблон для обработки этого сценария?
Ответ №1:
Вы обязательно захотите создать свой собственный HttpRequestMessage и использовать SendAsync. К сожалению, у вас не будет метода расширения для установки токена-носителя, но это лучший способ обработки HttpClient.
Комментарии:
1. Я подозревал, что это будет ответ. Я использую HttpClientExtensions, поэтому я могу использовать HttpClient. PostAsJsonAsync. Существует ли HttpRequestMessageExtensions с аналогичными методами расширения обработки JSON или мне нужно использовать свой собственный?
2. Боюсь, я не видел этого в официальной библиотеке. До сих пор все застряли в написании своего собственного шаблона, используя сериализованный JSON в StringContent .