您可以像这样创建身份验证委托处理程序:
public class AuthenticationHttpMessageHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
// Get the token or other type of credentials here
// string scheme = ... // E.g. "Bearer", "Basic" etc.
// string credentials = ... // E.g. formatted token, user/password etc.
request.Headers.Authorization =
new AuthenticationHeaderValue(scheme, credentials);
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
然后将其添加到 HttpClient 构建器和 DI 容器中:
services
.AddTransient<AuthenticationHttpMessageHandler>()
.AddHttpClient("MyClient")
.AddHttpMessageHandler<AuthenticationHttpMessageHandler>();
然后使用 IHttpClientFactory 创建 HttpClient 实例。
这种方法的核心优势是您可以清楚地分离关注点。您无需接触主处理程序,无需手动管理客户端创建,您可以利用工厂及其构建器扩展方法的全部功能。身份验证处理程序自然地注入到管道中,并为每个请求添加授权。这个处理程序可以通过抽象出凭据的来源来进一步增强,并使处理程序依赖于一些 IAuthenticationProvider 抽象,这将只需要 DI 配置而不涉及 HttpClient 配置代码。