Azure AD用户断言报错:缺少Directory.Read.All权限范围的技术咨询
解决"Token missing scope 'Directory.Read.All'"权限问题
我来帮你一步步排查并解决这个令牌权限缺失的问题:
1. 检查UI应用请求令牌的Scope参数
你用ADAL获取令牌时,必须明确指定包含Directory.Read.All的scope,格式要对应你的Web API配置:
- 如果是Web API自身需要验证这个权限,scope应该是你的Web API的应用ID URI加上权限名称,比如在UI的代码里:
var requestedScopes = new[] { "api://{你的Web API客户端ID}/Directory.Read.All" }; var authResult = await authContext.AcquireTokenAsync(requestedScopes, userCredential, clientId); - 如果你的Web API需要代表用户调用Microsoft Graph的
Directory.Read.All接口,那得用**On-Behalf-Of(OBO)**流程:先让UI获取访问Web API的令牌,再由Web API用这个令牌向Azure AD申请访问Graph的令牌。
2. 确认Azure AD中权限的管理员同意状态
Directory.Read.All是需要管理员级同意的委托权限,普通用户没法自行授权。你要登录Azure门户检查:
- 进入UI应用的「API权限」页面,查看
Directory.Read.All权限的状态是否为「已授予{你的租户名称}的管理员同意」。如果显示「需要管理员同意」,点击页面上的「授予管理员同意」按钮完成授权。 - 同时确认Web API的「API权限」页面是否正确添加了该委托权限(不过你的场景是UI调用Web API,重点还是UI应用的权限配置)。
3. 校验Web API的Bearer验证配置
你的Web API用UseWindowsAzureActiveDirectoryBearerAuthentication做令牌验证,得确保配置正确处理scope:
- 可以在配置里添加
TokenValidationParameters,明确指定要验证的scope和受众:private void ConfigureAuthentication(IAppBuilder app) { app.UseWindowsAzureActiveDirectoryBearerAuthentication( new WindowsAzureActiveDirectoryBearerAuthenticationOptions { Tenant = ConfigurationManager.AppSettings["ida:Tenant"], TokenValidationParameters = new TokenValidationParameters { ValidAudience = ConfigurationManager.AppSettings["ida:Audience"], // 要和Web API的客户端ID/应用ID URI一致 ScopeClaimType = "scp", // 指定存储scope的声明字段 // 可选:添加自定义验证逻辑,检查scp是否包含Directory.Read.All ValidateIssuer = true } }); } - 确保
ValidAudience设置正确,避免令牌受众不匹配导致的验证失败。
4. 解析令牌确认Scope是否存在
用JWT解析工具查看UI获取的令牌内容,检查scp声明里是否包含Directory.Read.All:
- 如果
scp里没有这个值,说明UI获取令牌时没成功请求到该权限,回到步骤1和2重新排查。 - 如果
scp里有这个值但Web API还是报错,那大概率是Web API的验证逻辑有问题,仔细检查步骤3的配置。
额外提示
ADAL已经被微软官方弃用了,建议你后续迁移到MSAL.NET(Microsoft Authentication Library),它对权限请求、令牌缓存和最新Azure AD特性的支持更完善,能减少这类权限问题的出现。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

