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

Azure Function未鉴权即可访问问题排查及身份权限配置咨询

问题分析与解决方案

为什么AuthorizationLevel.Function设置未生效?

最常见的原因有两点:

  1. host.json禁用了严格函数授权:如果配置中extensions.http.disableStrictFunctionAuth被设为true,会直接绕过Function的密钥验证逻辑,导致AuthorizationLevel.Function失效。
  2. 静态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应用的身份验证能力实现角色授权:

  1. 在Azure AD中创建并分配角色:
    • 前往Azure AD -> 应用注册,找到静态Web应用对应的应用注册(若未存在,可先在静态Web应用的「身份验证/授权」中启用Azure AD自动创建)。
    • 在应用注册的「应用角色」中添加自定义角色(例如ApiAccessRole),并将需要访问API的用户/安全组分配到该角色。
  2. 修改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身份验证:

  1. 在Function App的「身份验证/授权」中启用Azure AD,设置「要求授权」,拒绝匿名请求。
  2. 在对应的应用注册中添加应用角色并分配给用户/组。
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:10:08