Я добавляю преобразование претензий в мое приложение 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 по-другому, чтобы не вызывать этот цикл?