Как установить токен-носитель OIDC / OAuth в C # HttpClient при потоковой передаче темы клиента

#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 .