如何使用Microsoft.Rest.ServiceClient<>有客户证书?

时间:2016-05-29 08:22:28

标签: c# .net rest asp.net-web-api client-certificates

上下文

我有一个经过测试的工作Web API服务,该服务配置为客户端证书身份验证。现在我想打电话给它并提供客户证书。我想使用Microsoft.Rest.ServiceClient<>,因为我使用Visual Studio 2015“添加”/“REST Api客户端...”生成了我的类型化客户端类。

注意:我必须从文件或其他流中加载我的X 509客户端证书,因为客户端将在PaaS环境中运行,因此我将无权访问任何操作系统提供的证书存储。< / p>

X509Certificate certificate = new X509Certificate(path, password);

问题

对于较低的抽象级别,我知道如何将客户端证书添加到请求中:

var request = (HttpWebRequest) WebRequest.Create(host);
request.ClientCertificates.Add (certificate);

然而,当使用更高抽象级别的类Microsoft.Rest.ServiceClient<>时,我无法弄清楚将客户端证书引入调用管道的位置。

到目前为止我尝试了什么

  • 我检查了一些相关类的属性,没有证书 找到相关的房产/方法
  • 我检查了ServiceClientCredentials抽象类,但只找到了两个后代:基于令牌和基本身份验证。
  • 我试图在发送之前找到一些IoC工具来获取请求:没有成功。

1 个答案:

答案 0 :(得分:0)

我找到了一种对我有用的方法。 导入REST API客户端时,我修改了以下方法

原始

protected CLASSNAME(Uri baseUri, HttpClientHandler rootHandler, params DelegatingHandler[] handlers) : this(rootHandler, handlers)
        {
            if (baseUri == null)
            {
                throw new ArgumentNullException("baseUri");
            }
            this.BaseUri = baseUri;
        }

我已将保护设置为公开

public CLASSNAME(Uri baseUri, HttpClientHandler rootHandler, params DelegatingHandler[] handlers) : this(rootHandler, handlers)
            {
                if (baseUri == null)
                {
                    throw new ArgumentNullException("baseUri");
                }
                this.BaseUri = baseUri;
            }

使用方法

var handler = new WebRequestHandler();
var certFile = Path.Combine(@"path\to\your\certificate", "certificate.pfx");
handler.ClientCertificates.Add(new X509Certificate2(certFile,"<PASSWORD>"));

var client = new CLASSNAME(new Uri("URL"), handler);
//Do your methods on client

我希望这可以帮助您解决同样的问题。