调用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:切换为应用权限(无需用户共享,需管理员同意)
如果需要直接访问所有用户的日历(无需对方主动共享),必须改用应用权限模式:
- 在Azure AD中添加
Calendars.Read.All应用权限,必须由管理员授予全局同意。 - 修改Graph Client的注入代码,使用客户端凭据流(无需依赖登录用户的令牌):
注:如果你的API仍需要保留用户登录认证逻辑,可以保留原有的services.AddMicrosoftGraph(options => { options.Scopes = new[] { "https://graph.microsoft.com/.default" }; }) .AddClientCredentials(Configuration.GetSection(nameof(configuration.AzureActiveDirectory)));AddAuthentication配置,但需单独配置用于调用Graph的应用权限客户端,避免两种模式冲突。
内容的提问来源于stack exchange,提问作者Ttshkalol
相关产品推荐
相关产品推荐

