c# - 使用 MS Graph sdk 访问 Outlook 共享日历?

标签 c# azure asp.net-core microsoft-graph-api

我正在尝试访问已使用 MS Graph sdk 与用户共享的日历。我有一个网络应用程序和必要的权限,例如 Calendars.Read 。使用 postman ,我设法使用

读取用户的日历事件

https://login.microsoftonline.com/{app_id}/oauth2/v2.0/authorize

授权然后

https://graph.microsoft.com/v1.0/users/{user}/calendar/events

用于读取日历事件。在 postman 中一切正常,但我在使用 MSGraph 框架做同样的事情时遇到问题。我尝试使用这个例子 MS Example为了在 C# 中复制 postman 调用,但我收到一条错误消息

'Code: BadRequest /me request is only valid with delegated authentication flow'

当我使用await graphClient.Me.Calendars.Request().GetAsync()

Access is denied. Check credentials and try again

当我使用await graphClient.Users["<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cbaeb3aaa6bba7ae8baeb3aaa6bba7aee5a8a4a6" rel="noreferrer noopener nofollow">[email protected]</a>"].Calendars.Request().GetAsync()

从我读到的内容来看,出现了委托(delegate)身份验证流程的第一个错误,因为我正在使用应用程序权限模型,并且我应该在此上下文中使用委托(delegate)权限。问题是我不知道如何使用 ms 图形库来实现委派权限模型。我发现的唯一示例涉及直接调用 API,但我需要使用 MS Graph 库。

最佳答案

如您所知,有两种 api 权限,委托(delegate)/应用程序 api 权限。对于委托(delegate)权限,需要用户先使用自己的账户登录来获取访问 token ,并允许用户查询自己的日历信息,在这种情况下 /me/calendar 等于 /users/signed_in_user_id/日历

对于应用程序api权限,它允许守护应用程序查询每个人的日历信息。它仅支持 /users/user_id/calendar,因为没有用户登录您的应用,并且您的应用不知道“我”是谁。

您在问题中分享的女士示例使用了客户端凭据流程并需要授予应用程序权限。如果你想有一个功能来查询所有用户的信息,你应该继续使用它。代码示例应如下所示:

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_name.onmicrosoft.com";
var clientId = "aad_app_id";
var clientSecret = "client_secret";
var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
var res = await graphClient.Users["<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a7c2dfc6cad7cbc2e7c2dfc6cad7cbc289c4c8ca" rel="noreferrer noopener nofollow">[email protected]</a>"].Calendars.Request().GetAsync();

如果你想有一个功能,让用户先登录就可以查询自己的日历事件,那么你需要先集成OIDC来集成AAD进行身份验证,然后你可以使用await graphClient.Me .Calendars.Request().GetAsync()。更多详情可见this sample .

关于c# - 使用 MS Graph sdk 访问 Outlook 共享日历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74095593/

相关文章:

具有多个查询点的 Azure 存储表设计

c# - 保持 .NET 依赖注入(inject)有序

c# - DataGrid - 添加不属于数据的行(对于 "directory navigation")

c# - 无法加载文件或程序集 'System.Net.Http' 或其依赖项之一

azure - Azure SDK 2.6 中缺少 ETW EventSource 表

visual-studio - 如何将 EF 迁移应用到 Azure 中托管的数据库?

c# - 将依赖添加为 DLL 或添加为项目

asp.net - 如何在 PasswordSignInAsync 之前检查 AspNetUser 是否满足条件?

c# - wpf(太多绘图视觉效果)导致抖动平移和缩放

c# - 如何创建嵌套项目符号列表