【发布时间】:2018-08-14 04:30:28
【问题描述】:
背景
我正在尝试连接到 Office 365,以读取已授予权限的用户的日历。我尝试了两种选择:
- Exchange Web 服务 (EWS)
- 微软图形
EWS 可以工作,但缺点是我使用登录名/密码组合进行连接。即使我将它们加密存储,我也宁愿根本不存储它们。
Microsoft Graph 也能正常工作,但有一个巨大的缺点;我使用 API 对项目所做的任何更新都会发送给所有与会者。使用 EWS API 时可以关闭此行为,但对于 Graph 不能(还?)。
我想采用我对 Microsoft Graph 的 OAuth 实施,并使用 EWS 服务进行连接。除非用户需要,否则不会对与会者进行更新,也不会存储凭据。
问题
为了让我的应用程序正常工作,我需要这样做;
- 获取日历的时区,我通过读取此人的工作时间来做到这一点;
- 读取和写入日历项目,这是应用程序的目的。
我已经使用 OAuth 与 Office365 建立了 OAuth 连接。
我无法确定我需要的最小权限子集。我还没有找到任何关于此的文档。我尝试过的任何权利子集,当我要求 WorkHours 时都会收到 401。
最小代码示例
当我启用 Exchange Online 的应用注册支持的 38 个非管理员权限时,这将起作用,但对于我尝试过的每个子集都将失败。
[TestMethod]
public void ConnectUsingEws()
{
var accessToken = "eyJz93a...k4laUWw";
var credentials = new OAuthCredentials(accessToken);
var service = new ExchangeService(TimeZoneInfo.Utc);
service.Url = new Uri("https://outlook.office365.com/EWS/exchange.asmx");
service.TraceEnabled = true;
service.TraceFlags = TraceFlags.All;
service.Credentials = credentials;
// This next line is where the service will always throw a 401.
var workHours = UserConfiguration.Bind(service, "WorkHours",
WellKnownFolderName.Calendar, UserConfigurationProperties.All);
// Do some XML magic on workHours to get the timezone.
}
TLDR
我确定这是一项需要启用的权限,而且我也相当确定这不是一项非常明显的权限。
【问题讨论】:
标签: c# exchangewebservices microsoft-graph-api