c# - 声明转换期间调用 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 令牌,以免导致此循环?
解决方案
推荐阅读
- php - Laravel 8分页返回空白页
- r - 使用带有 stringr 函数的重置匹配令牌 \K
- c# - 创建使用模式但没有模式注册表 url 的 Kafka Producer
- php - 有没有办法使用 PHP 访问 json 对象元素
- python - 如何在 python 的另一列中的字符串值中从数据框中的一列中搜索字符串?
- sql - SQL 预期输入结束,但得到关键字 WHERE
- rpm - 使用 rpmbuild 创建 rpm 时源文件损坏
- selenium - Selenium:我应该在 find_element 中使用什么正确的对象类型和名称?
- python - 无法覆盖 FastAPI/FastAPi-Utils 中的依赖项
- angular - 注入新实例以测试 Angular(单例)服务持久化行为