已获管理员批准的User.Read.All为何未出现在OAuth令牌范围中
我的Azure应用已获得管理员批准的User.Read.All权限:

我在OAuth注册中请求了以下范围:
scope: - profile - email - openid - offline_access - User.Read.All - Files.Read.All
授权调用成功后得到如下响应:
{ "token_type": "Bearer", "scope": "profile email openid https://graph.microsoft.com/Files.Read.All", "expires_in": 3600, "ext_expires_in": 3600, "access_token": "...", "refresh_token": "...", "id_token": "..." }
为何生成的令牌范围中没有User.Read.All?
我验证后发现该令牌确实无法访问https://graph.microsoft.com/v1.0/users,报错如下:
{ "error": { "code": "ErrorInsufficientPermissionsInAccessToken", "message": "Exception of type 'Microsoft.Fast.Profile.Core.Exception.ProfileAccessDeniedException' was thrown.", "innerError": { ... } } }
我是否遗漏了某些配置?
若在范围中添加https://graph.microsoft.com/.default,虽能从/users端点得到有效响应,但仅包含我自身的用户信息。
1. User.Read.All未出现在令牌范围的原因
这是因为你使用的授权码流触发了增量授权机制:当请求的权限包含需要管理员同意的类型(如User.Read.All),但当前用户的授权上下文里没有该权限的同意记录时,Azure AD不会自动将其加入令牌。而Files.Read.All可能因支持用户同意,且你的账号已完成该权限的用户同意,所以被包含进令牌。
2. 正确获取包含User.Read.All令牌的方案
方案一:触发管理员同意流程
在发起授权请求时,附加prompt=admin_consent参数,强制触发管理员同意页面。管理员完成同意后,后续令牌请求就能包含User.Read.All权限。
核心授权请求示例:
GET https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize? client_id={你的客户端ID} &response_type=code &redirect_uri={你的重定向URI} &scope=profile email openid offline_access User.Read.All Files.Read.All &prompt=admin_consent
方案二:确认权限类型并使用对应流程
你添加/.default后仅能获取自身信息,说明应用的User.Read.All是委托权限而非应用权限:
- 委托权限:代表用户访问,即便管理员同意,普通用户默认也没有查看其他用户的权限,因此只能访问自身数据。
- 应用权限:应用自身拥有独立权限,无需用户上下文,可访问所有用户数据,适合后台服务场景。
如果是后台服务需求,需在Azure AD应用中申请应用权限的User.Read.All并由管理员批准,之后使用客户端凭证流(Client Credentials Flow)配合https://graph.microsoft.com/.default范围,即可获取能访问所有用户信息的令牌。
3. 关键注意事项
- 委托权限的
User.Read.All:管理员同意后,用户需具备目录内的用户查看权限才能访问其他用户数据,普通用户默认无此权限。 - 应用权限的
User.Read.All:无需用户参与,仅需管理员批准,适合无交互的后台任务。 - 增量授权模式下,未被同意的权限不会自动加入令牌,必须通过
prompt=admin_consent或用户同意完成权限确认。
内容的提问来源于stack exchange,提问作者Mugen

