我已经使用此处提供的说明配置了一个 Azure 网站(带有一个ApiController)以使用客户端证书身份验证。总结:您在网站上设置标志并从那时起开始要求客户端身份验证证书。clientCertEnabled
true
效果很好,但是,现在我想访问发送到服务器的客户端证书。根据 MSDN 文章,它应该在X-ARR-ClientCert
请求标头中可用,但它不是!
这意味着任何拥有客户端身份验证证书的人都可以访问我的 API,这在我的情况下是不可取的。
那么如何检索客户端发送到我的 Web API 的客户端身份验证证书呢?
更新 1:我实际上是通过Azure API Management调用我的 API 。我用我的客户端身份验证证书配置了 APIM,APIM 调用我的 API 没有问题。但是,当从 APIM 调用 API 时,不会设置 X-ARR-ClientCert 标头。当通过 Fiddler 直接调用时,我确实看到了标题。所以 APIM 以某种不同的方式调用我的 API?!?
更新 2:我再次检查了所有内容并生成了一些日志记录。DelegatingHandler
首先是我正在登录的课程的相关部分:
protected override async Task<HttpResponseMessage>
SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
Trace.TraceInformation("Going to validate client certificate.");
var x509Certificate2 = request.GetClientCertificate();
Trace.TraceInformation("Client cert: {0}", x509Certificate2 == null
? "<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: <null>
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:最后这恰好是我自己的错误(当然)。我确信后端的 urlhttps
实际上是http
. 客户端证书身份验证仅适用于 https,因此事后看来,在后端没有找到证书是完全合理的......