Azure Function未鉴权即可访问问题排查及身份权限配置咨询
问题分析与解决方案
为什么AuthorizationLevel.Function设置未生效?
最常见的原因有两点:
host.json禁用了严格函数授权:如果配置中extensions.http.disableStrictFunctionAuth被设为true,会直接绕过Function的密钥验证逻辑,导致AuthorizationLevel.Function失效。- 静态Web应用默认转发行为:当静态Web应用与Function集成时,默认的
/api/*路由转发不会携带Function密钥,相当于直接跳过了密钥验证步骤。
解决方案:实现Azure AD角色授权+静态Web应用访问控制
步骤1:修复Function密钥验证(可选,作为额外防护)
检查并修改host.json,确保未禁用严格函数授权:
{ "version": "2.0", "extensions": { "http": { "disableStrictFunctionAuth": false // 确保此值为false或直接移除该配置项 } } }
步骤2:配置静态Web应用的Azure AD身份验证与角色控制
由于API与静态Web应用关联部署,推荐利用静态Web应用的身份验证能力实现角色授权:
- 在Azure AD中创建并分配角色:
- 前往Azure AD -> 应用注册,找到静态Web应用对应的应用注册(若未存在,可先在静态Web应用的「身份验证/授权」中启用Azure AD自动创建)。
- 在应用注册的「应用角色」中添加自定义角色(例如
ApiAccessRole),并将需要访问API的用户/安全组分配到该角色。
- 修改
staticwebapp.config.json配置访问规则:
添加路由规则,要求/api/*路径必须经过Azure AD身份验证,且用户属于指定角色:
{ "routes": [ { "route": "/api/*", "authType": "aad", "allowedRoles": ["ApiAccessRole"] // 替换为你创建的角色名称 } ], "navigationFallback": { "rewrite": "/index.html", "exclude": ["/api/*"] } }
此时静态Web应用会自动拦截未授权请求,只有符合角色要求的已验证用户才能访问API。
步骤3:在Function中添加角色验证(可选,双重防护)
为进一步确保安全,可在Function代码中验证静态Web应用转发的身份信息:
public IActionResult Print([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req) { // 从请求头获取静态Web应用转发的用户角色 var roleHeader = req.Headers["X-MS-CLIENT-PRINCIPAL-ROLES"].ToString(); if (string.IsNullOrEmpty(roleHeader) || !roleHeader.Contains("ApiAccessRole")) { return new ForbidResult(); } _log.LogInformation("Authorized request received"); return new OkObjectResult("Welcome to Azure Functions!"); }
若希望静态Web应用转发请求时携带Function密钥,可在staticwebapp.config.json中添加forwardFunctionAuthCredentials: true,确保Function的密钥验证也生效。
替代方案:直接在Function App中启用Azure AD身份验证
如果不需要依赖静态Web应用的转发控制,也可以直接在Function App中配置Azure AD身份验证:
- 在Function App的「身份验证/授权」中启用Azure AD,设置「要求授权」,拒绝匿名请求。
- 在对应的应用注册中添加应用角色并分配给用户/组。
- 修改Function代码验证JWT令牌中的角色声明:
using System.IdentityModel.Tokens.Jwt; public IActionResult Print([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req) { if (!req.Headers.TryGetValue("Authorization", out var authHeader)) { return new UnauthorizedResult(); } var token = authHeader.ToString().TrimStart("Bearer ".ToCharArray()); var jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token); var userRoles = jwtToken.Claims.Where(c => c.Type == "roles").Select(c => c.Value); if (!userRoles.Contains("ApiAccessRole")) { return new ForbidResult(); } _log.LogInformation("Authorized request received"); return new OkObjectResult("Welcome to Azure Functions!"); }
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

