Azure中如何让系统托管身份的Logic App访问Entra ID认证的API
问题背景
我们已完成Azure API Manager(APIM)从订阅密钥到Entra ID的迁移,标准用户场景运行正常,操作步骤如下:
- 创建APIM实例并为其分配系统托管身份
- 创建后端应用
auth-test-app - 为该应用暴露API,设置应用ID URI为
api://auth-test-app - 创建范围
auth-test-app.readWrite - 创建客户端应用
auth-test-client - 为
auth-test-client申请API访问权限 - 配置密钥后可通过Postman正常访问API
现在需要让Azure Logic App使用其系统分配的托管身份访问该API,但使用auth-test-app的App ID作为受众时被拒绝访问,且找不到有效文档。需明确两个问题:
- 受众应配置为URI、
auth-test-app的App ID还是其他值? - 如何控制哪些应用可访问该API,是否可创建特定范围的权限分配?
解决方案
1. 受众的正确配置值
受众必须配置为后端应用auth-test-app中设置的应用ID URI(即api://auth-test-app),而非应用ID。
当Logic App通过托管身份请求访问令牌时,需指定该URI作为aud参数值。若使用应用ID作为受众,Entra ID返回的令牌会与APIM中配置的受众验证规则不匹配,直接导致访问被拒。
2. 应用访问控制与范围权限分配
可以通过Entra ID的应用权限分配机制,精准控制包括托管身份在内的应用对API的访问,且可绑定到特定范围:
- 为Logic App托管身份分配API权限
在Entra ID中找到Logic App的系统托管身份(本质是一个服务主体),进入「API权限」页面,点击「添加权限」,选择「我的API」分类下的auth-test-app,勾选所需范围(如auth-test-app.readWrite),最后完成权限添加及管理员同意(应用权限需管理员同意,委托权限视场景而定)。 - 在APIM中配置验证策略
在APIM的API验证策略里,确保JWT令牌验证规则同时检查aud和scp声明:<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized"> <openid-config url="https://login.microsoftonline.com/{你的租户ID}/v2.0/.well-known/openid-configuration" /> <required-claims> <claim name="aud" match="any"> <value>api://auth-test-app</value> </claim> <claim name="scp" match="any"> <value>auth-test-app.readWrite</value> </claim> </required-claims> </validate-jwt> - 更细粒度的访问控制
还可为auth-test-app创建应用角色,将Logic App的托管身份分配到对应角色,然后在APIM策略中检查roles声明,实现基于角色的访问控制。
内容的提问来源于stack exchange,提问作者vrghost
相关产品推荐
相关产品推荐

