首页 > 解决方案 > 声明转换期间调用 API

问题描述

我正在将声明转换添加到我的 Blazor(服务器端)应用程序中。我正在使用 DI 创建一个 HTTP Web API 服务。下面是启动代码。

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

我想在通过身份验证后使用声明转换来调用此 Web 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 调用,以便它返回声明列表。

2019 年 10 月 2 日更新

我想我发现这个问题与以下行引起的无限循环有关:

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

这会导致调用 AuthenticateAsync,然后再调用该行。有没有办法以不同的方式获取 Bearer 令牌,以免导致此循环?

标签: c#dependency-injectionasp.net-core-webapiclaimsblazor-server-side

解决方案


推荐阅读