ASP.NET Core Web API调用Graph报AADSTS65001错误求助
AADSTS65001 报错根因
该错误是代理流(On-Behalf-Of, OBO)全链路权限配置缺失导致:你仅在Web API应用注册中配置了Microsoft Graph的委托权限,但前端Web应用获取初始访问令牌时,没有申请对应的Graph权限,用户从未对这些Graph权限完成授权,Web API拿前端传过来的访问令牌向AAD申请Graph访问令牌时,AAD判定无对应权限授权,直接抛出异常。
修复步骤
1. 补全前端Web应用的权限配置
- 进入Azure AD中前端MVC Web应用的注册页,打开「API权限」板块
- 除了已添加的自定义Web API权限
api://<web-api-client-id>/scope.name,额外添加你在DownstreamApi中配置的所有Microsoft Graph委托权限:User.Read、Presence.Read、MailboxSettings.Read、Mail.Read、Calendars.Read、Files.ReadWrite - 对新增的所有Graph权限执行「授予管理员同意」操作
2. 修改前端令牌获取逻辑
前端向AAD申请访问Web API的令牌时,必须将需要的Graph权限和自定义API权限一起写入scope参数,让用户登录环节一次性完成所有委托权限的授权,示例代码:
// 申请令牌时传入全量所需权限 var scopes = new string[] { "api://<your-web-api-client-id>/scope.name", "user.read", "presence.read", "mailboxsettings.read", "mail.read", "calendars.read", "files.readwrite" };
如果前端使用增量同意机制,需要确保调用API收到授权挑战响应时,能自动触发增量授权流程补全缺失权限。
3. 修正Web API侧配置与代码问题
- 补全Web API的AzureAD配置项:OBO流兑换令牌需要Web API提供自身客户端凭证做认证,必须在
AzureAd配置块中添加提前在Azure AD中创建的客户端密钥:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "租户域名", "TenantId": "租户ID", "ClientId": "Web API客户端ID", "ClientSecret": "Web API客户端密钥" }
- 移除控制器中的同步阻塞调用:不要使用
.GetAwaiter().GetResult()同步等待异步方法,会引发线程池死锁,改为标准异步await调用:
[HttpGet] public async Task<ActionResult<IEnumerable<DealDto>>> GetDealsWithAccount() { // 直接await异步调用Graph接口 User user = await _graphServiceClient.Me.Request().GetAsync(); // 业务逻辑处理 return Ok(); }
- 确认
DownstreamApi中配置的所有Graph权限均为委托类型权限,OBO流不支持应用类型权限。
4. 验证结果
清除浏览器本地登录缓存,重新登录前端Web应用,完成权限授权后再次调用对应API接口,即可正常获取Microsoft Graph返回数据。
内容的提问来源于stack exchange,提问作者Chukwuma Obi
相关产品推荐
相关产品推荐

