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
相关产品推荐
相关产品推荐

