为Partner Center授权应用分配的应用角色未在访问令牌作用域中显示
核心问题
你当前的错误根源很明确:应用权限和委托权限属于完全不同的授权流程,不能通过用户委托流的刷新令牌获取包含应用权限的访问令牌。你一直用的是基于用户身份的委托流(带user_impersonation这类委托权限),这种流程生成的令牌始终绑定具体用户上下文;而MailboxSettings.Read应用权限需要用客户端凭据流(Client Credentials Flow),直接以应用身份请求令牌,不需要用户上下文。
你遗漏的关键操作步骤
切换到客户端凭据流获取应用权限令牌
放弃之前用用户刷新令牌请求令牌的方式,改用应用自身的凭据(客户端ID+客户端密钥/证书)向Azure AD令牌端点发起请求。注意应用权限在令牌中以roles声明返回,而非委托权限的scp,且请求时scope参数固定为https://graph.microsoft.com/.default。请求示例:
POST https://login.microsoftonline.com/{客户租户ID}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={你的应用客户端ID} &scope=https://graph.microsoft.com/.default &client_secret={你的应用客户端密钥} &grant_type=client_credentials验证GDAP权限的完整性
虽然你已经成功分配了应用角色,但要确认GDAP委托管理关系中,你的合作伙伴账户拥有应用管理员或云应用管理员角色——这是在客户租户中为应用分配应用权限的前提,确保该权限没有过期或被撤销。调整Graph API调用方式
应用权限没有用户上下文,所以不能用/me/mailboxSettings这种依赖当前用户的端点,必须指定具体用户ID来调用:GET https://graph.microsoft.com/v1.0/users/{目标用户ID}/mailboxSettings
错误原因拆解
你遇到的NoUserFoundWithGivenClaims错误,本质是你用了带用户上下文的委托流令牌,却尝试以应用权限的逻辑调用API,或者令牌中的用户在客户租户中不存在。而客户端凭据流生成的令牌不会包含用户上下文,完全以应用身份访问,就能避开这个问题。
内容的提问来源于stack exchange,提问作者Marcus Recck

