Request.HttpContext.Connection.ClientCertificate始终为null

时间:2018-12-03 07:51:04

标签: c# azure authentication asp.net-core

我在用于Linux的Azure应用程序服务上部署了一个ASP.Net核心网站。

在控制器中,我正在尝试获取如下客户端证书:

var callerCertificate = Request.HttpContext.Connection.ClientCertificate;

我总是得到callerCertificate作为 null 。 我尝试了await Request.HttpContext.Connection.GetClientCertificateAsync(),结果相同 null

我的网站虚拟主机创建如下:

WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseStartup<Startup>()
                .UseSerilog();

我还为网站(在Azure中)设置了SSL设置,如下所示:

enter image description here

客户端调用方是一个net462项目,该项目使用Microsoft.Rest.CertificateCredentials将证书设置为HTTP请求。

var cred = new CertificateCredentials(_deviceCertificate)
...
await this.cred.ProcessHttpRequestAsync(_httpRequest, cancellationToken).ConfigureAwait(false);

2 个答案:

答案 0 :(得分:1)

您可以尝试直接使用HttpClient而不是使用Microsoft.Rest.CertificateCredential添加证书。

var clientHandler = new HttpClientHandler();
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(_deviceCertificate);

var client = new HttpClient(clientHandler);
var result = client.GetAsync("https://yourservice").GetAwaiter().GetResult();

您可能还需要配置SSL协议(SSL2,SSL3,TLS等):

clientHandler.SslProtocols = SslProtocols.Tls;

答案 1 :(得分:0)

回答我自己的问题: 我可以从标题中获取客户端证书

  

string clientCertFromHeader = Request.Headers [“ X-ARR-ClientCert”];

但是,为什么Request.HttpContext.Connection.ClientCertificate不提供证书仍然是一个谜。