如何在Azure Pipeline中调用配置Azure Active Directory认证的Function App
可行解决方案
1 先修正服务主体权限配置
非交互式场景调用受AAD保护的Function App,必须使用应用权限而非委托权限,这是绝大多数401错误的根因:
- 进入Function App关联的AAD应用注册页,切换到「暴露API」标签,新增一个应用权限,例如命名为
Invoke.Function,权限类型选应用 - 进入Pipeline所用服务主体的应用注册页,切换到「API权限」标签,添加刚才创建的
Invoke.Function权限,必须点击授予租户管理员同意完成权限生效 - 如果你用的是Pipeline托管身份,直接给托管身份授予上述应用权限即可,无需额外维护密钥
2 Pipeline中正确获取令牌并调用
使用Azure CLI任务调用的示例配置如下:
- task: AzureCLI@2 inputs: azureSubscription: '<绑定了对应服务主体/托管身份的Azure服务连接名称>' scriptType: 'bash' inlineScript: | # 替换为你Function App对应的应用ID URI FUNC_APP_RES_ID="api://<你的Function App应用注册ID>" # 获取对应资源的访问令牌 ACCESS_TOKEN=$(az account get-access-token --resource $FUNC_APP_RES_ID --query accessToken -o tsv) # 携带令牌调用Function App端点 curl -H "Authorization: Bearer $ACCESS_TOKEN" https://<你的Function App域名>/api/<触发器路径>
如果你不想用Azure CLI,也可以直接调用OAuth2客户端凭据流获取令牌:
- 令牌请求地址:
https://login.microsoftonline.com/<你的AAD租户ID>/oauth2/v2.0/token - 请求参数为:
grant_type=client_credentials&client_id=<服务主体ID>&client_secret=<服务主体密钥>&scope=<你的Function App应用ID URI>/.default
3 401错误快速排查
如果配置完成后仍返回401,按以下步骤校验:
- 把获取到的JWT令牌复制到本地解析,检查
aud(受众)字段是否和Function App的应用ID URI一致,不一致说明获取令牌时的资源参数填错 - 检查令牌的
roles字段是否包含你授予的应用权限,没有的话说明权限未授予、未点管理员同意,或者权限类型选成了委托权限 - 检查Function App的易鉴权配置,确认「允许的令牌受众」列表中已添加你使用的应用ID URI
内容的提问来源于stack exchange,提问作者Shay Cohen
相关产品推荐
相关产品推荐

