从Azure API Management

时间:2015-12-03 16:39:32

标签: azure authentication azure-web-sites azure-api-management

我已使用提供的说明ApiController配置Azure网站(其中一个here)以使用客户端证书身份验证。总结:您将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 :最后这恰好是我自己的错误(当然)。我确信后端的网址是https,而事实上它是http。客户端证书身份验证仅适用于https,所以事后看来它完全合理,没有在后端找到证书...

3 个答案:

答案 0 :(得分:3)

您还需要为Azure托管API启用客户端证书身份验证 - 此步骤将确保Azure继承传入请求中的任何X-ARR-ClientCert标头。

否则Azure会在Request.Headers到达您的API之前从其中删除X-ARR-ClientCert标头。

注意:此设置仅适用于付费订阅

  1. 转到https://resources.azure.com/并选择所需的azure帐户
  2. 选择订阅 - &gt;资源组 - &gt; your_resource_group - &gt;提供者 - &gt; microsoft.web - &gt;网站 - &gt; your_website
  3. 从顶部按钮进入读/写模式,进入编辑模式,然后在属性下设置属性“clientCertEnabled”:true。
  4. "properties": {
        "name": "my-site",
        "state": "Running",
        "hostNames": [
          "my-site.azurewebsites.net",
          "(string)"
        ],
        ...
        "clientCertEnabled": true,
        ...
     }
    

    文档:https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-configure-tls-mutual-auth

答案 1 :(得分:2)

您真的想要为API的所有用户管理客户端证书吗?我理解使用客户端证书确保只有APIM可以直接与您的后端API通信。通常,通过API Management公开API的开发人员使用API​​密钥来控制对API的访问。使用此方法可以根据不同的配置产品应用策略&#34;。

如果您拥有管理证书创建和撤销的基础设施,那么这可能是正确的选择,这只是一种不常见的方法。话虽如此,我将研究API Management中可用的哪些选项,以便能够在APIM网关上提取证书指纹。

答案 2 :(得分:1)

我正在联系APIM的工程师,以弄清楚这是如何工作的,并会回复给您。当您在实际API(Web应用程序)前面有APIM时,我的猜测是APIM是代理,它将为您处理所有authN / authZ。因此,仅当成功时,请求才会转到您的API。我猜这就是为什么他们可能只是丢弃客户端证书而不是转发它。但我可以肯定地知道为什么客户端证书在Web应用程序中仍然有用。