403 Запрещено при попытке вызвать Graph API для добавления события календаря

У меня есть рабочее веб-приложение ASP.NET Core, которое успешно может получить graphClient и вызвать графический API (например, может создать OnLineMeeting) с помощью C#.

Однако если я попытаюсь создать событие календаря, я получу исключение.

«Доступ запрещен. Проверьте учетные данные и повторите попытку».

(при отладке с помощью Fiddler ответ соответственно 403 Forbidden)

  • В том же приложении, использующем то же самое graphClient, все работает для вызовов Graph API OnlineMeetings, поэтому все настройки, OpenID предположительно в порядке.
  • Мой пользователь может в интерактивном режиме создавать события календаря и имеет лицензию Teams.
  • Я вхожу в веб-приложение под этим «моим пользователем», используя арендатора Entra ID OpenIDConnect (см. код ниже).
  • Регистрация приложения Azure предоставила разрешение Calendar.ReadWrite API как для делегированного, так и для приложения (см. рисунок ниже).
  • Я использую буквально скопированную вкладку C# из этого руководства Пример 4. Создайте и включите событие в виде онлайн-встречи (прокрутите вниз до примера 4, переключитесь на C#)

Что я сделал до сих пор:

Что для меня подозрительно, если я отлаживаю запрос с помощью скрипача и декодирую токен доступа, который _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 для регистрации приложения:

Код в Program.cs, после чего я могу получить graphClient с помощью DI.

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(builder.Configuration.GetSection("GraphV1"))
    .AddInMemoryTokenCaches();

Используете ли вы поток учетных данных клиента?

Rukmini 06.05.2024 10:14

На снимке экрана показано, что делегированное разрешение Calendars.ReadWrite не получило согласия администратора.

juunas 06.05.2024 10:18

@Rukmini: Я полагаю, часть кода в program.cs делает это, для этого в appsettings.json требуются идентификаторы clientid, clientsecret и tenantid. Но, похоже, я также аутентифицирую себя как «свой пользователь», потому что, когда я перехожу к веб-приложению, оно перенаправляет меня на вход в MS. Кстати, API календаря предоставляются как разрешения приложения, так и делегированные разрешения.

g.pickardou 06.05.2024 10:19

@g.pickardou, поскольку вы используете делегированный поток, вам необходимо предоставить согласие администратора на Calendars.ReadWrite, чтобы отразить область действия.

Rukmini 06.05.2024 10:23

@g.pickardou в последнем столбце написано «Предоставлено для...» для всех остальных разрешений, кроме этого.

juunas 06.05.2024 10:25

Все ок, не могу поверить, как я не заметил пропавшего согласия. Работает в настоящее время. Большое спасибо.

g.pickardou 06.05.2024 10:27
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
6
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать событие Календаря, вам необходимо предоставить согласие администратора на Calendars.ReadWrite делегированное разрешение API:

Следовательно, чтобы устранить ошибку, обязательно предоставьте согласие администратора на разрешение Calendars.ReadWrite.

Убедитесь, что разрешение отражено в области токена доступа, как показано ниже:

Например, я успешно создал событие календаря для вошедшего в систему пользователя, как показано ниже:

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"
}

Если вы хотите создать событие календаря для любого другого пользователя, предоставьте Calendars.ReadWrite.All делегированное разрешение API.

Обратите внимание, что:

  • Для потока учетных данных клиента (непользовательский интерактивный поток) предоставьте разрешения типа приложения.
  • Для делегированного потока (интерактивного пользовательского потока) предоставьте разрешения делегированного типа.

Другие вопросы по теме