我想为一个类型化的HttpClient添加一个HttClientHandler,以便包括证书身份验证。
我在互联网上找到的所有示例都是这样的:
services.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler()
{
// Set here whatever you need to get configured
};
});
但我不想在这里包含获取证书的所有逻辑,所以我想使用通用版本的ConfigurePrimaryHttpMessageHandler<>并编写自己的消息处理程序来在请求中包含证书。
问题是我不知道如何实现消息处理程序...我应该从HttpClientHandler继承吗?
求助!
更新
正如我最初怀疑的,并且@Nkosi确认的那样,在这种情况下从HttpClient处理程序派生是正确的方法。最终代码看起来类似于这样:
public class MyHttpClientHandler : HttpClientHandler
{
private readonly IMyConfiguration _myConfiguration;
public MyHttpClientHandler(IMyConfiguration myConfiguration)
{
_myConfiguration = myConfiguration;
using (var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
certStore.Open(OpenFlags.ReadOnly);
var certCollection = certStore.Certificates.Find(
X509FindType.FindBySerialNumber,
_myConfiguration.MyCertificateSerial,
true);
X509Certificate2 certificate = certCollection[0];
ClientCertificateOptions = ClientCertificateOption.Manual;
SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
ClientCertificates.Add(certificate);
}
}
}
非常重要!
另一方面,在尝试注册我的http客户端处理程序时,我注意到它从未被调用。经过一些搜索,我发现目前存在一个有关此问题的未解决错误(https://github.com/aspnet/Extensions/issues/851)。因此,在修复之前,您需要以这种方式配置您的处理程序:
services.AddTransient<MyHttpClientHandler>();
services.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler(sp => sp.GetRequiredService<MyHttpClientHandler>());
HttpClientHandler
或任何派生类的HttpMessageHandler
派生。 https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.httpclientbuilderextensions.configureprimaryhttpmessagehandler?view=aspnetcore-2.2#Microsoft_Extensions_DependencyInjection_HttpClientBuilderExtensions_ConfigurePrimaryHttpMessageHandler__1_Microsoft_Extensions_DependencyInjection_IHttpClientBuilder_ - NkosiHttpClientHandler
仅适用于.NET Framework和Core <= 2.0。请参阅文档。需要使用HttpMessageHandler
。 - Peter L