我有一个可用的 ASP.NET Core Web 应用程序,它可以成功获取
graphClient
并使用 C# 调用图形 API(例如可以创建 OnLineMeeting
)
但是,如果我尝试创建日历事件,则会出现异常
“访问被拒绝。请检查凭据并重试。”
(使用 Fiddler 调试时,相应响应为 403 Forbidden)
graphClient
的同一个应用程序中,一切都适用于 Graph API OnlineMeetings 调用,因此所有配置、OpenID 都应该没问题。到目前为止我所做的:
对我来说可疑的是,如果我使用 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权限:
Program.cs中的代码,之后我可以使用DI
获得
graphClient
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(builder.Configuration.GetSection("GraphV1"))
.AddInMemoryTokenCaches();
要创建日历事件,您需要授予管理员同意
Calendars.ReadWrite
委托的API权限:
确保权限反映在访问令牌范围内,如下所示:
例如,我为登录用户成功创建了日历事件,如下所示:
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 权限
注意: