【问题标题】:Configure HttpClient to use a service to populate the authentication header?配置 HttpClient 以使用服务填充身份验证标头?
【发布时间】:2021-02-04 06:21:45
【问题描述】:

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

services.AddHttpClient<ApiService>();

客户端发出的所有请求都必须经过身份验证。所以我需要将上面的 sn-p 稍微修改一下:

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

不记名令牌需要在 5 分钟内更新,因此我需要创建需要依赖项的服务,例如 HttpClient(用于验证和获取令牌)和 MemoryCache(用于在令牌有效时存储令牌)。

问题是,如您所见,这仍处于构建服务提供者之前的阶段,所以我目前无法解决任何问题......我在这里有什么选择?

【问题讨论】:

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


    【解决方案1】:

    您可以像这样访问 ServiceProvider:

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

    如果您没有可以访问提供程序的重载,您将需要更新您的依赖项。 AddHttpClient 将注册一个临时客户端,因此 func(“工厂方法”)将在您每次注入时运行。

    【讨论】:

    • 呃完美,我没看到这个
    【解决方案2】:

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

    例如

    public class ApiService
    {
        private readonly HttpClient client;
    
        public ApiService(HttpClient client, IAuthenticationService auth)
        {
            // configure client here
    
            this.client = client;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多