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

如何保护APIM防护的Azure Functions,仅响应同资源组Web App请求

Azure Functions 访问控制配置方案(针对指定Web App)

一、限制Functions仅响应指定Web App的GET请求

1. 基于IP白名单实现"非指定主机返回403"

你可以通过Web App的出站IP地址做精准访问控制:

  • 先在Azure门户进入你的Web App「属性」页,复制所有出站IP地址(含额外出站IP)
  • 二选一配置限制:
    • APIM端配置:在对应API操作中添加ip-filter策略,仅允许上述出站IP访问,非允许IP直接返回403。示例策略代码:
      <ip-filter action="allow">
          <address>WebApp出站IP1</address>
          <address>WebApp出站IP2</address>
      </ip-filter>
      
    • Functions端配置:进入Functions「网络」→「访问限制」,添加允许规则,将Web App的出站IP加入白名单,默认拒绝所有其他请求。

注意:如果Web App更换服务计划、扩缩容,出站IP可能变更,需要同步更新白名单。

2. 更具扩展性的方案

若想避免IP变更带来的维护成本,推荐自定义请求头验证:

  • 在Web App调用Functions时,添加约定的自定义请求头(比如X-App-Auth-Token),值为预先设定的密钥
  • 在APIM或Functions中验证头的有效性:
    • APIM用validate-header策略直接拦截无效请求
    • 或在Functions代码中做验证,逻辑更灵活

如果Web App和Functions在同一资源组,也可尝试Azure托管标识:给Web App分配系统托管标识,在Functions的IAM中添加该标识的权限,同时在Functions代码中验证请求身份。但你的Web App面向公众,自定义头方案更直接。

二、在Azure Functions中检查HTTP请求头

完全可以通过代码检查请求头,C# Http触发函数示例:

[FunctionName("GetDataFunction")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    ILogger log)
{
    // 获取指定请求头
    var customHeader = req.Headers["X-Custom-Header"].FirstOrDefault();
    
    if (string.IsNullOrEmpty(customHeader))
    {
        return new StatusCodeResult(StatusCodes.Status403Forbidden);
    }
    
    // 后续业务逻辑
    return new OkObjectResult("Valid request");
}

三、原有Base64头验证方案在Azure中的有效性

你的原有方案完全可以在Azure Functions中沿用,逻辑和本地Web API一致:

[FunctionName("LegacyAuthFunction")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    ILogger log)
{
    var authHeader = req.Headers["X-Legacy-Auth"].FirstOrDefault();
    if (string.IsNullOrEmpty(authHeader))
    {
        return new StatusCodeResult(StatusCodes.Status403Forbidden);
    }
    
    try
    {
        // Base64解码
        var decodedBytes = Convert.FromBase64String(authHeader);
        var decodedValue = Encoding.UTF8.GetString(decodedBytes);
        
        // 验证解码后的值
        if (decodedValue != "预先约定的验证值")
        {
            return new StatusCodeResult(StatusCodes.Status403Forbidden);
        }
    }
    catch (FormatException)
    {
        // Base64解码失败,返回403
        return new StatusCodeResult(StatusCodes.Status403Forbidden);
    }
    
    // 业务逻辑处理
    return new OkObjectResult("Authenticated request");
}

该方案不受部署环境影响,只要Web App调用时携带正确的请求头,就能正常完成验证。

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:40:06