You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Microsoft Graph获取其他用户事件时出现访问拒绝错误排查

问题:获取其他用户日历事件时触发Access Denied错误

代码实现

注入Graph Client的代码

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration.GetSection(nameof(configuration.AzureActiveDirectory)))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(Configuration.GetSection(nameof(configuration.MicrosoftGraph)))
.AddInMemoryTokenCaches();

获取其他用户日历事件的代码

var events = await Graph.Users[Email].Calendars[calendarId].Events.Request().GetAsync();

触发的错误信息

Microsoft.Graph.ServiceException: Code: ErrorAccessDenied
Message: Access is denied. Check credentials and try again.
ClientRequestId: d1903ca9-1a96-4704-bc9c-35c01f557bf1

权限配置情况

已配置相关Microsoft Graph权限(对应权限截图)


问题原因及解决办法

核心问题

你当前采用**委托权限(Delegated Permissions)**模式调用Graph API:通过登录用户的令牌获取下游API访问权限,这种模式默认只能访问当前登录用户自身的数据。要访问其他用户的日历,必须满足对应的权限类型或范围要求。

具体解决方向

方向1:继续使用委托权限(需目标用户共享日历)

  • 确认已添加Calendars.Read或Calendars.Read.Shared委托权限,且已完成用户/管理员同意操作。
  • 要求目标用户将指定日历共享给当前登录用户,否则即使权限配置正确,也无法访问未共享的日历资源。

方向2:切换为应用权限(无需用户共享,需管理员同意)

如果需要直接访问所有用户的日历(无需对方主动共享),必须改用应用权限模式:

  1. 在Azure AD中添加Calendars.Read.All应用权限,必须由管理员授予全局同意。
  2. 修改Graph Client的注入代码,使用客户端凭据流(无需依赖登录用户的令牌):
    services.AddMicrosoftGraph(options =>
    {
        options.Scopes = new[] { "https://graph.microsoft.com/.default" };
    })
    .AddClientCredentials(Configuration.GetSection(nameof(configuration.AzureActiveDirectory)));
    
    注:如果你的API仍需要保留用户登录认证逻辑,可以保留原有的AddAuthentication配置,但需单独配置用于调用Graph的应用权限客户端,避免两种模式冲突。

内容的提问来源于stack exchange,提问作者Ttshkalol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:35:04