ASP.NET Core 5 WebAPI集成Azure AD后调用Graph API异常问题咨询
问题解决指引
1. 日历访问权限配置修正
你当前无法获取日历项的核心原因确实和权限授权有关,按以下步骤调整即可:
- 在Azure AD应用注册的「API权限」页面,确认已添加Graph API的委派权限
Calendars.Read(只读日历)或Calendars.ReadWrite(可编辑日历) - 联系租户全局管理员,点击权限列表上方的「为<你的租户名称>授予管理员同意」,完成权限的全局授权,普通用户无法自行同意日历类的高权限接口。
2. 配置文件补充校验
确认appsettings.json中已经补全DownstreamApi节点的配置,确保包含日历相关的权限范围:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "<你的租户域名>", "ClientId": "<你的应用ClientId>", "TenantId": "<你的租户TenantId>" }, "DownstreamApi": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "User.Read Calendars.Read" }
3. 接口调用逻辑示例
直接在控制器中注入GraphServiceClient即可完成调用,无需手动处理Token换发,OBO流逻辑已由Microsoft.Identity.Web库自动处理:
[Authorize] [ApiController] [Route("api/[controller]")] public class GraphProxyController : ControllerBase { private readonly GraphServiceClient _graphServiceClient; public GraphProxyController(GraphServiceClient graphServiceClient) { _graphServiceClient = graphServiceClient; } [HttpGet("my-events")] public async Task<IActionResult> GetMyCalendarEvents() { var events = await _graphServiceClient.Me.Events .Request() .Top(20) .GetAsync(); return Ok(events); } }
4. 异常排查方法
如果调整后仍无法访问,可按以下步骤定位问题:
- 将调用Graph时使用的AccessToken复制到JWT解析工具中,检查
scp声明是否包含Calendars.Read,如果缺少说明权限配置未生效 - 确认你在Postman中请求WebAPI时使用的Token受众是你自己的WebAPI ClientId,不要直接用Graph的Token请求你的WebAPI,OBO流会自动完成Token的换发。
内容的提问来源于stack exchange,提问作者Tango
相关产品推荐
相关产品推荐

