C# 如何在Simple.OData.Client中使用证书身份验证?

C# 如何在Simple.OData.Client中使用证书身份验证?,c#,odata,simple.odata,simple.odata.client,C#,Odata,Simple.odata,Simple.odata.client,如何在Simple.OData.Client中进行证书身份验证?我有X509Certificate2,我想在调用api时使用它。我使用.NETFramework4.6 我做了一些搜索,我知道可以通过HttpClientHandler添加。但我不知道该怎么做。下面是我的代码 void foo() { var clientSettings = new ODataClientSettings(""); clientSettings.OnApplyClientHandler = new Ac

如何在Simple.OData.Client中进行证书身份验证?我有X509Certificate2,我想在调用api时使用它。我使用.NETFramework4.6

我做了一些搜索,我知道可以通过HttpClientHandler添加。但我不知道该怎么做。下面是我的代码

void foo()
{
   var clientSettings = new ODataClientSettings("");
   clientSettings.OnApplyClientHandler = new Action<HttpClientHandler>(AddClientCertificate);
   var client = new ODataClient(clientSettings);
}

private void AddClientCertificate(HttpClientHandler handler )
{
// I have working code to retrieve the certificate.
X509Certificate2 targetCertificate = RetrieveCertificate();

//TODO : Add the certificate to the HttpClientHandler
}
void foo()
{
var clientSettings=新的ODataClient设置(“”);
clientSettings.OnApplyClientHandler=新操作(AddClientCertificate);
var客户端=新ODataClient(客户端设置);
}
私有无效AddClientCertificate(HttpClientHandler处理程序)
{
//我有工作代码来检索证书。
X509Certificate2 targetCertificate=RetrieveCertificate();
//TODO:将证书添加到HttpClientHandler
}
简短: 使用
ODataClientSettings.OnCreateMessageHandler
并返回a,然后设置
ClientCertificates

再次查看代码之后,您需要做的是将委托分配给OnCreateMessageHandler,而不是OnApplyClientHandler,因为底层代码创建了一个HttpClientHandler,并且您需要一个WebRequestHandler,例如

请注意,如果您这样做,它将不会调用ApplyClientHandler,因此您还必须在此委托中分配任何其他消息处理程序。 我不能很容易地检查出这一点,因为我没有访问证书安全站点的权限,但代码中没有任何内容表明这不起作用


希望下面的代码片段之一工作良好

  • X509Certificate2 targetCertificate=RetrieveCertificate();
    handler.ClientCertificates.Add(targetCertificate)

  • var filePath=rootPath+@“/App_Data/apigee.pfx”
    X509Certificate2Collection certificates=新的X509Certificate2Collection(); 证书.Import(文件路径,“测试”,x509keystrageflags.MachineKeySet | X509keystrageFlags.PersistKeySet)
    httpClientHandler.ClientCertificates.AddRange(证书)

  • var setting = new ODataClientSettings(baseAddresss, credentials) 
    {
         OnCreateMessageHandler = { 
         var handler = new WebRequestHandler();
         handler.ClientCertificates.Add(certificate);
    
         return handler;
         }
    }