У меня есть рабочее веб-приложение ASP.NET Core, которое успешно может получить graphClient
и вызвать графический API (например, может создать OnLineMeeting
) с помощью C#.
Однако если я попытаюсь создать событие календаря, я получу исключение.
«Доступ запрещен. Проверьте учетные данные и повторите попытку».
(при отладке с помощью Fiddler ответ соответственно 403 Forbidden)
graphClient
, все работает для вызовов Graph API OnlineMeetings, поэтому все настройки, OpenID предположительно в порядке.Что я сделал до сих пор:
Что для меня подозрительно, если я отлаживаю запрос с помощью скрипача и декодирую токен доступа, который _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();
На снимке экрана показано, что делегированное разрешение Calendars.ReadWrite не получило согласия администратора.
@Rukmini: Я полагаю, часть кода в program.cs делает это, для этого в appsettings.json требуются идентификаторы clientid, clientsecret и tenantid. Но, похоже, я также аутентифицирую себя как «свой пользователь», потому что, когда я перехожу к веб-приложению, оно перенаправляет меня на вход в MS. Кстати, API календаря предоставляются как разрешения приложения, так и делегированные разрешения.
@g.pickardou, поскольку вы используете делегированный поток, вам необходимо предоставить согласие администратора на Calendars.ReadWrite, чтобы отразить область действия.
@g.pickardou в последнем столбце написано «Предоставлено для...» для всех остальных разрешений, кроме этого.
Все ок, не могу поверить, как я не заметил пропавшего согласия. Работает в настоящее время. Большое спасибо.
Чтобы создать событие Календаря, вам необходимо предоставить согласие администратора на 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.
Обратите внимание, что:
Используете ли вы поток учетных данных клиента?