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

Http触发Azure函数读取应用/函数密钥:claims返回default而非实际密钥求解决

在Azure Http触发函数中读取调用者传递的应用/函数密钥并做权限校验

核心问题说明

Azure Functions不会将密钥值直接暴露在claims中,claims里的keyid对应的是密钥的名称(比如默认密钥的名称是"default",自定义密钥则是你设置的名称),而非密钥本身。要获取调用者传递的密钥值,或者基于密钥标识做权限校验,可以用以下两种方式:

方式一:读取请求头获取密钥值

当调用者通过密钥访问函数时,会在请求头中携带x-functions-key,你可以直接读取这个头的值来做进一步校验:

C# 示例代码

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    // 读取请求头中的密钥
    string incomingKey = req.Headers["x-functions-key"];
    // 从应用设置中获取允许的密钥(避免硬编码)
    string allowedKey = Environment.GetEnvironmentVariable("VALID_FUNCTION_KEY");

    if (string.IsNullOrWhiteSpace(incomingKey) || !string.Equals(incomingKey, allowedKey, StringComparison.Ordinal))
    {
        return new UnauthorizedResult();
    }

    // 执行授权后的业务逻辑
    return new OkObjectResult("已通过权限校验");
}

Python 示例代码

import os
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    # 读取请求头密钥
    incoming_key = req.headers.get('x-functions-key')
    # 从环境变量获取合法密钥
    allowed_key = os.environ.get('VALID_FUNCTION_KEY')

    if not incoming_key or incoming_key != allowed_key:
        return func.HttpResponse("权限校验失败", status_code=401)

    # 业务逻辑处理
    return func.HttpResponse("已通过权限校验", status_code=200)

方式二:基于密钥ID(KeyID)做权限分组校验

如果你不想直接处理密钥值,可以在Azure门户创建多个自定义函数密钥(比如admin-key、user-key),每个密钥对应不同的权限组。然后通过claims获取密钥的名称(KeyID),以此区分权限:

C# 示例代码

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    ILogger log)
{
    // 从claims中获取密钥ID(即密钥名称)
    string keyId = claimsPrincipal.FindFirstValue("http://schemas.microsoft.com/2017/07/functions/claims/keyid");

    // 根据密钥ID判断权限
    switch (keyId)
    {
        case "admin-key":
            // 执行管理员权限逻辑
            return new OkObjectResult("管理员权限操作");
        case "user-key":
            // 执行普通用户权限逻辑
            return new OkObjectResult("普通用户权限操作");
        default:
            return new UnauthorizedResult();
    }
}

注意事项

  • Azure会提前验证请求中密钥的合法性,进入函数逻辑的请求都是密钥有效的请求,你只需做细分权限校验。
  • 禁止在日志中输出密钥值,避免敏感信息泄露。
  • 建议将合法密钥或密钥ID配置到Azure Functions的应用设置中,不要硬编码在代码里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:30:56