我们的 .NET 应用程序当前使用 RestSharp v106 和 Ninject。它使用客户端证书通过安全服务器对用户进行身份验证。用户启动应用程序,选择 Windows 证书存储中安装的证书之一,并通过用户密码或其他方法解锁它。此时,DI 容器已经创建了我们的
RestSharp.RestClient
实例。
在restharp v107之前,我们将使用
RestSharpClient.ClientCertificates
通过Authenticator
实现来添加或替换以前使用的证书与用户选择的证书。从 v107 开始,ClientCertificates
是 RestClientOptions
的一部分,并且只能在实例化新 RestSharp.RestClient
时设置。
我们目前正在考虑实现一个类似于简单工厂的工厂 - 我们将使用证书标识符作为字典键,而不是基本 URL。
实例化
RestClient
后是否有其他方法来设置证书,或者这个工厂是一个可行的选择吗?
有多种可能的方法可以解决我的问题中概述的问题。
选项 1 是编写一个工厂并延迟所有需要证书的
RestClient
的实例化,直到证书可用。我们测试了这种方法,效果很好。
第二个选项是设置一个自己的
HttpClientHandler
并将其传递给 RestClient
构造函数 [0]。 HttpClientHandler
提供了一个名为 X509CertificateCollection
的 ClientCertificates
属性,可用于在运行时添加和删除证书。然而,这样做可能不是线程安全的。
[0] 我们仅将
HttpClientHandler
直接与 HttpClient
一起使用。由于外部因素,我们不得不放弃 RestSharp。可以相当安全地假设将 RestClient(HttpMessageHandler)
与 HttpClientHandler
一起使用会产生类似的效果。