You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在使用应用程序网关/WAF的Azure Web应用中读取客户端证书

在使用应用程序网关/WAF的Azure Web应用中读取客户端证书

嘿,这个问题我太熟了!当你把应用程序网关(AG)和WAF架在App Service前面后,之前正常的客户端证书读取逻辑失效,核心原因是默认情况下AG不会将收到的客户端证书转发给后端的App Service。下面一步步帮你搞定:

第一步:配置应用程序网关转发客户端证书

  • 登录Azure门户,找到你的应用程序网关资源,进入HTTP设置页面,编辑当前使用的后端HTTP设置
  • 在设置面板里找到「客户端证书」选项,将「从后端服务器验证客户端证书」切换为「是」,保存配置。这一步是让AG把接收到的客户端证书以X-ARR-ClientCert请求头的形式转发给App Service

第二步:调整App Service的证书相关配置

  • 进入你的App Service资源,打开配置 > 常规设置
  • 保持「客户端证书模式」为你之前设置的「Optional Interactive User」(如果不需要区分交互式用户,也可以改成「Optional」)
  • 确认「允许客户端证书」选项处于开启状态(和你之前的设置一致即可,顺手检查下更稳妥)

第三步:修改C#代码读取转发的证书

之前你可能直接通过HttpRequest.ClientCertificate获取证书,但现在证书会被AG放在X-ARR-ClientCert请求头里,需要调整代码兼容两种访问场景(直接访问App Service/通过AG访问):

using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Mvc;

public IActionResult ValidateClientRequest()
{
    X509Certificate2 clientCert = null;

    // 先尝试读取原生ClientCertificate(应对直接访问App Service的情况)
    if (Request.HttpContext.Connection.ClientCertificate != null && 
        Request.HttpContext.Connection.ClientCertificate.IsValid)
    {
        clientCert = Request.HttpContext.Connection.ClientCertificate;
    }
    // 没有的话,读取AG转发的证书
    else
    {
        var certHeaderValue = Request.Headers["X-ARR-ClientCert"].FirstOrDefault();
        if (!string.IsNullOrWhiteSpace(certHeaderValue))
        {
            try
            {
                // 解码Base64格式的证书内容
                var certBytes = Convert.FromBase64String(certHeaderValue);
                clientCert = new X509Certificate2(certBytes);
            }
            catch (Exception ex)
            {
                // 处理证书解析失败,比如打日志或者返回错误
                return BadRequest("Invalid client certificate provided");
            }
        }
    }

    if (clientCert == null)
    {
        // 根据业务逻辑处理无证书情况,比如返回未授权
        return Unauthorized("Client certificate is required for this endpoint");
    }

    // 这里执行你的证书验证和用户查找逻辑
    // 示例:检查证书颁发者、有效期,或者关联数据库用户
    if (!clientCert.IssuerName.Name.Contains("Your-Trusted-CA"))
    {
        return Forbid("Certificate is from an untrusted authority");
    }

    // 业务逻辑处理...
    return Ok($"Authenticated user: {clientCert.SubjectName.Name}");
}

额外注意事项

  • 检查WAF规则:别让WAF把X-ARR-ClientCert请求头拦截了,这个是AG转发证书的关键,必须允许它通过
  • 测试验证:用curl或Postman带客户端证书请求AG的公网IP,然后去App Service日志里确认X-ARR-ClientCert头部是否正常接收,证书解析是否成功
  • 权限检查:如果你的应用需要操作证书私钥(一般不需要),要确保App Service有对应的权限配置

这样调整后,不管用户是直接访问App Service,还是通过应用程序网关/WAF访问,你的C#应用都能正常读取并验证客户端证书了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:53:00