如何保护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加入白名单,默认拒绝所有其他请求。
- APIM端配置:在对应API操作中添加
注意:如果Web App更换服务计划、扩缩容,出站IP可能变更,需要同步更新白名单。
2. 更具扩展性的方案
若想避免IP变更带来的维护成本,推荐自定义请求头验证:
- 在Web App调用Functions时,添加约定的自定义请求头(比如
X-App-Auth-Token),值为预先设定的密钥 - 在APIM或Functions中验证头的有效性:
- APIM用
validate-header策略直接拦截无效请求 - 或在Functions代码中做验证,逻辑更灵活
- APIM用
如果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
相关产品推荐
相关产品推荐

