Azure Functions服务间调用报错:应用未分配角色
我之前搭建服务间认证时也碰到过这个一模一样的问题,折腾了好一阵才搞明白!结合你的描述,我整理几个最关键的排查方向,你可以逐一验证:
先确认角色分配的对象和范围是否正确
很多人会踩这个坑:把IAM角色分配给了**应用注册(App Registration)本身,但实际上Azure的权限是绑定到应用注册对应的服务主体(Service Principal)**上的。你需要打开Azure Portal,找到你的Function App,进入「访问控制(IAM)」页面,检查角色分配列表里的对象是不是你的应用注册对应的服务主体(名字和应用注册一致,类型显示「服务主体」),并且分配的范围是当前的Function App,角色至少要有「Reader」或者自定义的读取权限角色。检查应用注册清单里的
accessTokenAcceptedVersion字段
这个是很容易被忽略的关键点!如果你的Function App用的是Azure AD v2端点,应用注册清单里的accessTokenAcceptedVersion必须设为2(默认可能是null或者1)。你可以进入应用注册的「清单」页面,找到这个字段,修改为2后保存,等待5-10分钟让配置生效,再重新测试。验证角色分配是否已生效
Azure的IAM角色分配有时候会有延迟,你可以用Azure CLI命令快速确认:az ad sp show --id <你的应用注册客户端ID>查看输出里的
assignedRoles字段,确认是否包含你给Function App分配的角色。如果没有,要么是分配对象选错了,要么就是配置还没生效,多等一会儿再查。解码令牌确认权限声明
如果前面的配置都没问题,你可以把获取到的access token用JWT解码工具解析,检查里面的roles字段是否包含你分配的角色权限。如果没有,那大概率是令牌请求时的resource参数不对——要确保请求令牌时的资源是你的Function App的客户端ID或者它的URL(比如https://<your-function-app>.azurewebsites.net)。检查Function App的认证配置
确认Function App的「身份验证」设置里,已经正确配置了Azure AD租户信息,并且允许你的应用注册客户端ID访问。同时要确保没有设置不必要的访问规则,导致你的请求被拦截。
一般来说,前两个点是最容易出问题的,尤其是服务主体的角色分配和accessTokenAcceptedVersion的配置,你先重点排查这两个!
内容的提问来源于stack exchange,提问作者Eric Jorgensen

