.Net核心HttpClientFactory如何动态添加证书

时间:2019-05-23 10:25:14

标签: c#

HttpclientFactory注册时,只能在startUp中进行证书注入。有什么方法可以动态注入吗?

services.AddHttpClient().ConfigurePrimaryHttpMessageHandler(() => {
    var certificate = new X509Certificate2("", "", X509KeyStorageFlags.MachineKeySet);
    var handler = new HttpClientHandler();
    handler.ClientCertificates.Add(certificate);
    return handler;
});

2 个答案:

答案 0 :(得分:2)

对于任何偶然发现此问题的用户,我有非常相似的需求,并且对默认HttpClientFactory实现的这种限制感到沮丧;我有一个非常健壮的HttpClient管道,其中全部链接了Polly和委派处理程序,但是根据特定的端点URL,需要使用的基础证书可能有所不同,并且我不一定要注册四个或五个版本的不同类型的客户端使用相同的管道,我也不希望必须在组合根目录获得可用的证书。我写了一个库来扩展DefaultHttpClientFactory,以添加对上下文应用的处理程序的支持,同时保留DefaultHttpClientFactory提供的池化,到期和类型化客户端管道。

DefaultHttpClientFactory使用命名的客户端名称或键入的客户端的类型名称来唯一地区分和跟踪启动时附加的管道和选项,以及生成的主处理程序将在托管池中使用的名称;例如,类型化的客户端“ MyTypedClient”将在名为“ MyTypedClient”的池中具有主处理程序,这些处理程序将根据需要重新使用和续订。

通过装饰DefaultHttpClientFactory使用的HttpClientFactoryOptions IOptionsMonitor并在处理程序管理过程中挂接IHttpMessageHandlerBuilderFilter,可以使所有管道工作正常,但可以在池中创建和解析更精细的处理程序,即“ MyTypedClient-contextA”, “ MyTypedClient-contextB”具有不同的上下文设置,例如不同的证书。该库只要求您实现几个接口以区分这些上下文,然后在必须创建一个新的接口时,为该上下文返回格式正确的主处理程序。

如果您的证书在每个请求上都不相同或很少重复使用(因为无论如何您都失去了池化的所有好处),但是如果您拥有一个完善的类型化客户端管道,对于URL A与URL B(或用户A与用户B,等等)具有不同的证书,并且您经常连接到它们,这可能使您省去一些麻烦。如果可以帮助您,欢迎您提出任何反馈或意见。

答案 1 :(得分:0)

您为ConfigurePrimaryHttpMessageHandler传递的委托将根据其生命周期(默认为两分钟)被调用。因此,在该代表中,您实际上可以制作一个动态证书列表(创建HttpClient实例时每两分钟调用一次)。

您可以使用SetHandlerLifeTime(在AddHttpClient()上的构建器上)选择处理程序的生存期,并在需要时选择较短的时间跨度...但是,如果您需要其他处理程序,多次使用同一客户,完全违反了使用HttpClientFactory的整个目的。

所以我看到三个选项:

  1. 如果您有不同的证书集,请使用namedtyped客户端,并为每个名称/类型分配不同的处理程序。

  2. 如果相反,您的http客户端“通常”使用相同的证书,并且它们只是在某个时间点发生更改...则根据您的应用程序需求设置合理的寿命(使用SetHandlerLifetime

  3. 如果您实际上需要按请求(或按实例)定义证书,则不要使用HttpClientFactory或任何其他客户端池方法,因为您不想完全将客户池合并在一起,并且您希望每个请求都拥有一个不同的客户端(具有自己的处理程序)。