基于客户端证书或基于AAD令牌的身份验证的Azure应用服务

时间:2017-07-23 18:33:42

标签: azure authentication azure-web-sites client-certificates azure-web-app-service

需要基于客户端证书或基于AAD令牌的身份验证在Azure应用服务中托管的web api。

我正在将一个Web API从经典云服务迁移到azure app服务。 API支持使用有效证书或有效AAD令牌的调用。 代码如下:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    ClaimsPrincipal principal;
    var cert = request.GetClientCertificate();
    if (cert != null)
    {
        //authenticate client certificate 
        //Set principal from client certificate 
    }
    else
    {
        //get AAD token 
        //authenticate & set principal 
    }
    return await base.SendAsync(request, cancellationToken);
}

问题出在App服务中,基于证书的调用request.GetClientCertificate()返回null而不是X509Certificate2对象。因此无法验证基于证书的呼叫。

我也尝试过以下链接,但是在这种情况下,无法使用证书进行呼叫,因为它需要为整个网站制作SSL证书。 https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-configure-tls-mutual-auth

1 个答案:

答案 0 :(得分:0)

您的解释中缺少许多细节。共享代码段无用。

Azure App Service 中,有一个位于托管应用程序的VM前面。为您的网络应用启用 TLS Mutual Auth 后,系统会为整个应用启用该功能。目前,没有选项可以针对特定页面或子文件夹执行此操作。

当客户端访问该站点时,前端会提示他们输入客户端证书。假设客户端将证书提供给前端,它会以主机头的形式将此证书传递给后端VM&#34; X-ARR-ClientCert &#34;

我没有看到在上面的代码片段中的任何地方使用过它。您在问题中链接的文章(Azure App Service TLS Mutual Auth)中也对此进行了解释:

nodesep

您需要阅读 X-ARR-ClientCert 标题内容,然后将其转换为 X509Certificate2 对象,然后对此进行检查。