403 尝试调用Graph API添加日历事件时被禁止

问题描述 投票:0回答:1

我有一个可用的 ASP.NET Core Web 应用程序,它可以成功获取

graphClient
并使用 C# 调用图形 API(例如可以创建
OnLineMeeting

但是,如果我尝试创建日历事件,则会出现异常

“访问被拒绝。请检查凭据并重试。”

(使用 Fiddler 调试时,相应响应为 403 Forbidden

  • 在使用相同
    graphClient
    的同一个应用程序中,一切都适用于 Graph API OnlineMeetings 调用,因此所有配置、OpenID 都应该没问题。
  • 我的用户可以交互式创建日历事件,并且拥有 Teams 许可证
  • 我使用 Entra ID 租户 OpenIDConnect 登录到“我的用户”的 Web 应用程序(参见下面的代码)
  • Azure 应用程序注册已同意委托和应用程序的 Calendar.ReadWrite API 权限(见下图)
  • 我实际上使用的是本教程中复制的 C# 选项卡示例 4:创建并启用一个事件作为在线会议(向下滚动到示例 4,切换到 C#)

到目前为止我所做的:

对我来说可疑的是,如果我使用 fiddler 调试请求,并解码 _graphClient 放入标头的访问令牌,我在范围中看不到 Calendar.ReadWrite 范围...

{
    ...
    "scp": "Chat.Create Chat.Read Chat.ReadBasic Chat.ReadWrite email OnlineMeetingRecording.Read.All OnlineMeetings.Read OnlineMeetings.ReadWrite openid profile User.Read",
    ...
}

问题:

为什么我的访问被拒绝?如果答案是缺少范围,那么如何添加日历范围? (说实话,我不明白为什么 scp 声明中的那些范围,我没有明确指定这些范围......)

更多诊断信息:

应用注册API权限:

API Permissions for the Application Registration

Program.cs中的代码,之后我可以使用DI

获得
graphClient

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(builder.Configuration.GetSection("GraphV1"))
    .AddInMemoryTokenCaches();
azure microsoft-graph-api access-token outlook-calendar
1个回答
0
投票

要创建日历事件,您需要授予管理员同意

Calendars.ReadWrite
委托的API权限:

enter image description here

确保权限反映在访问令牌范围内,如下所示:

enter image description here

例如,我为登录用户成功创建了日历事件,如下所示:

POST https://graph.microsoft.com/v1.0/me/events
Prefer: outlook.timezone="Pacific Standard Time"
Content-type: application/json

{
  "subject": "Let's go for lunch",
  "body": {
    "contentType": "HTML",
    "content": "Does noon work for you?"
  },
  "start": {
      "dateTime": "2024-05-15T12:00:00",
      "timeZone": "Pacific Standard Time"
  },
  "end": {
      "dateTime": "2024-05-15T14:00:00",
      "timeZone": "Pacific Standard Time"
  },
  "location":{
      "displayName":"Harry's Bar"
  },
  "attendees": [
    {
      "emailAddress": {
        "address":"[email protected]",
        "name": "User"
      },
      "type": "required"
    }
  ],
  "allowNewTimeProposals": true,
  "transactionId":"7E163156-7762-4BEB-A1C6-729EA81755A7"
}

enter image description here

如果您想为任何其他用户创建日历事件,请授予

Calendars.ReadWrite.All
委托 API 权限

注意

  • 对于客户端凭证流(非用户交互流)授予应用程序类型权限。
  • 对于委托流程(用户交互流程)授予委托类型权限。
© www.soinside.com 2019 - 2024. All rights reserved.