获取O365用户的后台作业遇未授权异常求助
解决调用Microsoft Graph API /users接口时的“应用无资源访问权限”错误
我之前碰到过一模一样的问题,咱们一步步来排查和解决:
核心问题定位
先看你提供的令牌负载,里面没有roles字段——这是关键!用客户端凭据流(也就是你用的AcquireTokenForClientAsync)获取的应用权限令牌,正常情况下应该包含roles数组,比如:
"roles": ["User.Read.All"]
没有这个字段,说明你的令牌根本没携带应用权限,Graph API自然会拒绝访问。
排查&解决步骤
1. 确认权限类型是「应用权限」而非「委派权限」
客户端凭据流只支持应用权限,委派权限是给用户交互场景用的,完全不适用你的服务端调用场景:
- 登录Azure AD控制台,找到你的应用注册,进入「API权限」页面
- 检查你添加的
Read.User.All权限,类型必须是「应用权限」(图标是锁的样式),而不是「委派权限」(图标是用户头像) - 如果加错了,删掉现有权限,重新添加应用权限的
User.Read.All,然后让管理员点击「授予管理员同意」
2. 重新获取令牌(清空缓存)
如果已经正确配置了应用权限并完成管理员同意,但令牌还是没有roles字段,大概率是因为你用的是权限同意前缓存的旧令牌:
- 重启你的微服务,清空TokenCache里的旧令牌
- 重新调用获取令牌的代码,再用jwt.ms解码新令牌,确认
roles字段已经出现
3. 验证Authority配置正确性
确保你的authority是指定租户的地址,格式为:
"https://login.microsoftonline.com/<你的租户ID>/"
如果用了common或organizations(多租户场景),需要确保目标租户的管理员已经给你的应用授予了权限,否则令牌也不会包含角色。
4. 确认Graph API端点正确性
你调用的应该是https://graph.microsoft.com/v1.0/users,这个端点支持应用权限的客户端凭据调用。如果误用了其他需要用户上下文的端点,也会导致权限错误。
代码验证
你的令牌获取和Graph客户端初始化代码是没问题的:
ConfidentialClientApplication的参数配置正确,用了客户端凭据(credential)AcquireTokenForClientAsync用了https://graph.microsoft.com/.default范围,这是应用权限的正确范围DelegateAuthenticationProvider正确添加了Bearer令牌到请求头
只要解决了令牌里缺少roles的问题,调用/users接口应该就能正常工作了。
内容的提问来源于stack exchange,提问作者geochr
相关产品推荐
相关产品推荐

