如何增强Azure Functions安全性,仅允许Azure Web App前端访问?
仅允许Azure Web App访问Azure Functions的实现方案
可行性说明
完全可行。单纯依赖函数密钥和CORS无法阻止Postman这类工具的模拟请求——CORS仅约束浏览器的同源策略,而函数密钥一旦泄露即可被复用。需要结合身份验证+请求来源校验的组合机制实现严格的访问控制。
具体实现方法
1. Azure AD服务主体身份验证(推荐)
通过Azure AD实现服务间的身份校验,只有Web App能获取到合法的访问令牌:
- 在Azure AD中注册两个应用:一个对应Azure Functions,一个对应Azure Web App。
- 配置Azure Functions的身份验证:
- 进入Functions的「身份验证」面板,启用「Microsoft Entra ID」作为身份提供者,关联为Functions创建的AD应用。
- 设置「未经过身份验证的请求」为「HTTP 401 未经授权」,直接拒绝无令牌请求。
- 在Web App的React代码中,使用
@azure/msal-browser库获取AD令牌,请求Functions时在请求头携带Authorization: Bearer <token>。 - 此方案下,Postman无法获取Web App对应的合法令牌(除非拿到Web App的应用密钥,可通过权限限制降低风险),从而无法访问Functions。
2. 校验Azure内部请求头
Azure Web App向Functions发起请求时会携带专属的内部请求头,可在Functions代码中添加校验逻辑:
- 检查
X-Forwarded-For是否属于Web App的出站IP范围(可从Web App「属性」面板获取出站IP列表)。 - 检查
X-ARR-SSL头是否存在(该头由Azure App Service转发请求时自动添加)。
示例Node.js Functions代码:
module.exports = async function (context, req) { // 替换为你的Web App出站IP列表 const allowedOutboundIPs = ["xxx.xxx.xxx.xxx", "yyy.yyy.yyy.yyy"]; const clientIP = req.headers["x-forwarded-for"]?.split(",")[0]?.trim(); const hasArrSslHeader = !!req.headers["x-arr-ssl"]; if (!allowedOutboundIPs.includes(clientIP) || !hasArrSslHeader) { context.res = { status: 403, body: "Forbidden: Request not from allowed source" }; return; } // 正常业务逻辑处理 context.res = { status: 200, body: "Request processed successfully" }; };
3. 私有网络隔离(最高安全级别)
将Web App和Functions纳入同一Azure虚拟网络,彻底阻断公网访问:
- 创建Azure虚拟网络,将Web App部署到虚拟网络的子网中;为Functions配置Private Link,使其仅在虚拟网络内可访问。
- 配置Functions的网络访问控制,仅允许来自虚拟网络内部的请求,拒绝所有公网流量。
- 此方案下,Postman等公网工具完全无法触及Functions,只有同虚拟网络内的Web App能发起请求。
4. 函数密钥+Referer头校验(临时过渡方案)
如果暂时无法部署AD或私有网络,可通过双重校验提升安全性:
- 同时验证请求头中的函数密钥和
Referer字段,确保Referer包含Web App的域名(如https://your-webapp.azurewebsites.net)。 - 注意:
Referer头可被篡改,仅能阻止非专业的模拟请求,适合临时过渡使用。
关键注意事项
- 禁止在前端代码中硬编码密钥或敏感信息,应存储在Web App的「应用设置」中,前端通过环境变量读取。
- 定期轮换函数密钥和AD应用密钥,降低泄露后的风险。
内容的提问来源于stack exchange,提问作者alexolguin
相关产品推荐
相关产品推荐

