配置HttpClient以使用服务填充身份验证标头?

时间:2020-10-21 10:39:41

标签: c# asp.net-core .net-core dependency-injection

我想使用typed HTTP client,所以我在ServiceCollection上这样注册它

services.AddHttpClient<ApiService>();

客户端发出的所有请求都必须经过身份验证。因此,我需要对上面的代码片段进行一些修改:

services.AddHttpClient<ApiService>(c =>
{
    c.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "");
});

无记名令牌需要更新整整5分钟,因此我需要创建需要依赖项的服务,例如HttpClient(用于认证和获取令牌)和MemoryCache(用于存储令牌,只要它是有效的)。 >

问题是,正如您所看到的那样,这仍处于构建服务提供者之前的阶段,因此我现在无法解决任何问题……我在这里有什么选择?

2 个答案:

答案 0 :(得分:3)

您可以这样访问ServiceProvider:

services.AddHttpClient<ApiService>(provider, c) =>
{
    var token = provider.GetRequiredService<MyTokenService>().GetToken();
    c.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
});

如果您没有具有提供者的超载访问权限,则需要更新依赖项。 AddHttpClient将注册一个临时客户端,以便每次您将func(“工厂方法”)注入某个地方时都可以运行。

答案 1 :(得分:0)

您能在ApiService的构造函数中执行此操作,还通过DI将身份验证服务传递给它吗?

例如

public class ApiService
{
    private readonly HttpClient client;

    public ApiService(HttpClient client, IAuthenticationService auth)
    {
        // configure client here

        this.client = client;
    }
}
相关问题