EWS 身份验证:OAuth 的服务帐户凭据

EWS Authentication: Service Account credentials to OAuth

今天我们有一个将约会同步到 Exchange 的应用程序。 我们有几个客户使用不同版本的 Exchange,即:Exchange 2010、o365。 每个客户都创建了一个具有我们用于身份验证的模拟权限的服务帐户。 一个例子:

var credentials = new WebCredentials(serviceAccount.username, serviceAccount.password);
var service = new ExchangeService
{
   Credentials = credentials,
   Url = new Uri(exchangeUri)
}
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, email);

因此,从 2020 年 10 月 13 日起,此方法将不再有效,我们将不得不改用 OAuth。 我已阅读 MS 文档 "Authenticate an EWS application by using OAuth": https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth

我已经在 Azure AD 中注册了我的应用程序,并获得了一个应用程序 ID。 我想我应该使用 "Application permissions",并使用以下代码来获取令牌:

// Configure the MSAL client to get tokens
var app = ConfidentialClientApplicationBuilder
    .Create(ConfigurationManager.AppSettings["appId"])
    .WithAuthority(AzureCloudInstance.AzurePublic, ConfigurationManager.AppSettings["tenantId"])
    .WithClientSecret(ConfigurationManager.AppSettings["clientSecret"]).Build();

// The permission scope required for EWS access
var ewsScopes = new string[] { "https://outlook.office.com/.default" };

//Make the toekn request
AuthenticationResult authResult = await app.AcquireTokenForClient(ewsScopes).ExecuteAsync();

我的问题:

  1. 这是我的 "correct" 方法,还是我遗漏了什么?
  2. 当前身份验证是否仍适用于本地服务器(2020 年 10 月 13 日之后)?
  3. OAuth 身份验证是否适用于 Exchange 2010?
  4. 如果是这样,我们的客户如何获得tentantId(我知道在哪里可以找到o365)。
  5. 令牌的 TTL 是多少?

非常感谢help/suggestions。

  1. 是的,唯一看起来缺少的是 X-MailboxAnchor header(您也应该使用 Basic Auth 执行此操作)
  2. 是的,OnPrem 不受 Office365 中所做更改的影响
  3. 否,OAuth 仅适用于已配置混合现代身份验证的 OnPrem,请参阅 https://docs.microsoft.com/en-us/office365/enterprise/hybrid-modern-auth-overview (with Exchange there are certain CU requirements for 2013 and 2016). I would also suggest you read https://practical365.com/exchange-server/configure-hybrid-modern-authentication-for-exchange-server/
  4. 访问令牌的 TTL 为 60 分钟,如果您的应用程序将长期使用该令牌,EWS Managed API 的弱点之一是它没有callback/event 当它发出服务器请求时,您可以在其中检查令牌是否过期。因此,您需要在代码逻辑中考虑这一点,方法是在任何服务调用之前添加您自己的验证,或者查看修改 github 源代码并在底层代码中添加您自己的逻辑。

对于你的第四个问题: 您可以配置 azure 访问令牌生命周期并将其延长至最长 24 小时。 Link