我已经配置了一个Azure网站(带有一个ApiController),以按照此处提供的说明使用客户端证书身份验证。总结:您将clientCertEnabled
标志设置为true
,然后在您的网站上开始请求客户端身份验证证书。
效果很好,但是,现在我要访问发送到服务器的客户端证书。根据MSDN文章,它应该在X-ARR-ClientCert
请求标头中可用,除了它不是!!
这意味着具有客户端身份验证证书的任何人都可以访问我的API,在我看来,这是不可取的。
那么,如何检索客户端发送到我的Web API的客户端身份验证证书?
更新1:我实际上是通过Azure API管理调用我的API 。我使用客户端身份验证证书配置了APIM,APIM调用了我的API,没有任何问题。但是,从APIM调用API时,未设置X-ARR-ClientCert标头。当直接通过Fiddler调用时,我确实看到了标头。因此,APIM以某种不同的方式调用我的API吗?
更新2:我再次经历了所有事情,并产生了一些日志记录。首先,DelegatingHandler
我要从中记录该类的相关部分:
protected override async TaskSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { Trace.TraceInformation("Going to validate client certificate."); var x509Certificate2 = request.GetClientCertificate(); Trace.TraceInformation("Client cert: {0}", x509Certificate2 == null ? " " : x509Certificate2.Subject); try { var headerKeys = string.Join("|", request.Headers.Select(h => h.Key)); Trace.TraceInformation("Header keys: {0}", headerKeys); ...
以及结果日志输出:
2015-12-07T08:08:24 PID[8464] Information Going to validate client certificate. 2015-12-07T08:08:24 PID[8464] Information Client cert:2015-12-07T08:08:24 PID[8464] Information Header keys: Connection|Host|Max-Forwards|Conf-Organisation-Key|Ocp-Apim-Subscription-Key| X-Forwarded-For|X-LiveUpgrade|X-ARR-LOG-ID|DISGUISED-HOST|X-SITE-DEPLOYMENT-ID| X-Original-URL
因此,没有客户端证书,也没有X-ARR-ClientCert
标头。
更新3:这是当我直接使用客户端身份验证证书进入实际API时生成的日志:
2015-12-07T09:16:45 PID[8464] Information Going to validate client certificate. 2015-12-07T09:16:45 PID[8464] Information Client cert: CN=rwildenberg@itq.nl 2015-12-07T09:16:45 PID[8464] Information Header keys: Connection|Accept|Accept-Encoding|Accept-Language|Cookie|Host|Max-Forwards| User-Agent|Upgrade-Insecure-Requests|DNT|X-LiveUpgrade|X-ARR-LOG-ID|DISGUISED-HOST| X-SITE-DEPLOYMENT-ID|X-Original-URL|X-Forwarded-For|X-ARR-SSL|X-ARR-ClientCert
直接来自请求的客户端证书和预期的X-ARR-ClientCert
标头。
更新4:最后,这碰巧是我自己的错误(当然)。我确信后端的url https
实际上是http
。客户端证书身份验证仅在https上有效,因此事后看来,在后端没有找到证书是很合理的……