API вызова во время преобразования претензий - PullRequest
0 голосов
/ 01 октября 2019

Я добавляю преобразование претензий в мое приложение Blazor (на стороне сервера). Я создаю службу HTTP Web API, используя DI. Ниже приведен код запуска.

services.AddHttpClient<IAPIClient, APIClient>();
services.AddScoped<IClaimsTransformation, ClaimsLoader>();

Я хотел бы использовать преобразование утверждений для вызова этого веб-API после проверки подлинности. Это выглядит так:

public class ClaimsLoader : IClaimsTransformation
{
   private readonly HttpClient _apiClient;
   private readonly IHttpContextAccessor _httpAccessor;

   public ClaimsLoader(IHttpContextAccessor httpAccessor, HttpClient apiClient)
   {
      _httpAccessor = httpAccessor;
      _apiClient = apiClient;
   }
   public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
   {
      var identity = (ClaimsIdentity)principal.Identity;
      var claimsIdentity = new ClaimsIdentity(
             identity.Claims,
             identity.AuthenticationType,
             identity.NameClaimType,
             identity.RoleClaimType);

      ...claims Web API call
       return new ClaimsPrincipal(claimsIdentity);
   }
}

Это настройка клиента Web API:

public class APIClient : IAPIClient
{
   private readonly HttpClient _httpClient;
   public APIClient(IHttpContextAccessor httpAccessor, HttpClient client, IConfiguration configuration)
   {
      var accessToken = httpAccessor.HttpContext.GetTokenAsync("access_token").Result;
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
      client.BaseAddress = new Uri(configuration["Api_Location"]);
      _httpClient = client;
   }
....
}

Проблема возникает из-за того, что я плохо понимаю DI. Я хочу использовать APIClient, который я создал до него, но я не уверен, как передать это в ClaimsLoader. Я предполагаю, что это будет что-то вроде:

private readonly IHttpContextAccessor _httpAccessor;
private readonly IAPIClient _apiClient;

public ClaimsLoader(IHttpContextAccessor httpAccessor, IAPIClient apiClient)
{
   _httpAccessor = httpAccessor;
   _apiClient = apiClient;
}

Но при попытке этого приложение зависает при запуске. Чего мне не хватает? У меня есть вызов API, создающий и работающий так, чтобы он возвращал список заявок.

ОБНОВЛЕНИЕ 10/2/2019

Я думаю, что обнаружил, что проблема связанак бесконечному циклу, вызванному следующей строкой:

var accessToken = _httpAccessor.HttpContext.GetTokenAsync("access_token").Result;

Это вызывает вызов AuthenticateAsync, который, в свою очередь, затем вызывает эту строку снова. Есть ли способ получить токен Bearer по-другому, чтобы не вызывать этот цикл?

...