如何配置Azure Functions的TokenRequestContext作用域及跨函数认证
Azure Function 跨函数调用认证(本地+部署环境)
一、激活api://{someGuid}/.default作用域的正确方式
api://{someGuid}/.default是目标Azure Function App托管标识对应的默认作用域,其中{someGuid}是目标函数App托管标识的客户端ID(可在Azure门户目标函数的“身份”页面查看)。
使用该作用域的代码示例:
var tokenRequestContext = new TokenRequestContext(new[] {"api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/.default"});
要正常激活这个作用域,需确保:
- 目标函数App已启用系统分配或用户分配托管标识
- 源函数(或本地调试账号)拥有访问目标函数的权限
二、本地测试“获取令牌但未授权”的解决办法
1. 检查令牌受众(aud)是否匹配
本地获取令牌后,通过JWT解析工具查看令牌的aud字段,确认是否与目标函数的受众一致:
- 若目标函数用
api://{客户端ID}作为受众,aud需为api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - 若用函数域名,
aud需为https://your-function-app.azurewebsites.net
2. 给本地开发账号添加目标函数访问权限
在Azure门户操作:
- 进入目标函数App的身份验证页面,确保已启用Azure AD身份提供者
- 打开目标函数对应的Azure AD应用注册,在“用户和组”中添加你的本地开发账号(即你通过
az login登录的账号) - 或在目标函数的访问控制(IAM)中,给你的账号添加函数应用参与者角色
3. 本地调试时使用正确的凭据获取令牌
本地调试需用DefaultAzureCredential获取令牌,它会自动适配本地开发环境(优先使用az login的账号):
var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync(tokenRequestContext); // 给HttpClient添加授权头 _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
三、部署后跨函数调用的认证配置
- 源函数App启用托管标识:在Azure门户源函数的“身份”页面,启用系统分配托管标识(或创建用户分配托管标识)
- 给源函数托管标识添加目标函数权限:
- 进入目标函数App的访问控制(IAM),添加角色分配,选择函数应用参与者角色,将源函数的托管标识作为成员添加
- 部署后的令牌请求代码:
部署环境中DefaultAzureCredential会自动使用源函数的托管标识获取令牌,代码与本地调试一致,无需额外修改
内容的提问来源于stack exchange,提问作者EnenDaveyBoy
相关产品推荐
相关产品推荐

