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

时间:2020-03-20 09:43:35

标签: oauth exchangewebservices exchange-basicauth

今天,我们有一个将约会同步到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文档“使用OAuth验证EWS应用程序”: https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth

我已在Azure AD中注册了我的应用程序,并获得了一个应用程序ID。 我猜我应该使用“应用程序权限”,并使用以下代码来获取令牌:

// 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. 这对我来说是“正确”的方法,还是我错过了什么?
  2. 当前身份验证是否仍适用于本地服务器(2020年10月13日之后)?
  3. OAuth身份验证适用于Exchange 2010吗?
  4. 如果是这样,我们的客户如何获得tentantId(我知道在哪里可以找到o365)。
  5. 令牌的TTL是多少?

任何帮助/建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

  1. 是的,唯一缺少的是X-MailboxAnchor标头(您也应该使用Basic Auth来做到这一点)
  2. 是的,OnPrem不受Office365中所做的更改的影响
  3. 否,OAuth仅适用于配置了混合现代身份验证的用户,请参见https://docs.microsoft.com/en-us/office365/enterprise/hybrid-modern-auth-overview(对于Exchange,2013和2016年有某些CU要求)。我也建议您阅读https://practical365.com/exchange-server/configure-hybrid-modern-authentication-for-exchange-server/
  4. 访问令牌的TTL是60分钟,如果您的应用程序要长时间使用令牌,则EWS托管API的弱点之一是它没有回调/事件,您可以在其中在发出服务器请求时检查令牌到期。因此,您需要在代码逻辑中考虑这一点,方法是在任何服务调用之前添加您自己的验证,或者着眼于修改github源并在基础代码中添加您自己的逻辑。

答案 1 :(得分:0)

第四个问题: 您可以配置azure访问令牌的生存期,并将其最长扩展到24小时。 Link