调用Microsoft Graph读取Azure AD用户报权限不足错误如何解决?
问题原因
你遇到的授权错误基本由两类问题导致:权限配置错误、代码异步写法不规范。
1. 权限配置问题(核心原因)
你使用的是客户端凭证身份验证流(后台服务无用户登录场景),对应权限配置需要满足两个要求:
- 必须添加应用权限类型的
User.Read.All,不能添加委托权限类型的同名权限:委托权限仅适用于有登录用户的场景,服务后台调用Graph的场景不生效 - 添加权限后必须点击「授予<租户名称>管理员同意」按钮:应用类权限需要租户管理员手动授权才会实际生效,仅添加权限不会自动生效
你已经添加的User.Read权限对读取全租户用户的场景没有作用,可以删除。
2. 代码层面问题
你的GetUsers方法定义为返回值void,但内部使用了await关键字,属于不符合C#异步规范的写法,会导致异常无法正常捕获,甚至出现非预期的运行错误。
修复方案
第一步:修正权限配置
- 进入Azure Portal中对应应用注册的「API权限」页面
- 删除已添加的所有委托类型的用户相关权限
- 点击「添加权限」-> 选择「Microsoft Graph」-> 选择「应用权限」-> 搜索并勾选
User.Read.All - 点击权限列表上方的「授予管理员同意」按钮完成授权
第二步:修正代码写法
调整方法返回值为async Task,修正后的参考代码如下:
public async Task GetUsers() { var confidentialClient = ConfidentialClientApplicationBuilder .Create("my application id") .WithTenantId("my tenant id") .WithClientSecret("my application secret") .Build(); var graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new ClientCredentialProvider(confidentialClient)); var request = graphClient.Users.Request().Filter("accountEnabled eq true"); var users = await request.GetAsync(); }
可选校验步骤
如果配置完成后仍报错,可以验证权限是否正确下发:
- 调用Microsoft Identity平台获取令牌接口,用客户端凭证流获取访问令牌
- 解析JWT令牌,检查
roles声明中是否包含User.Read.All,存在则说明权限配置正常
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

