EWS 身份验证:OAuth 的服务帐户凭据
Posted
技术标签:
【中文标题】EWS 身份验证:OAuth 的服务帐户凭据【英文标题】:EWS Authentication: Service Account credentials to OAuth 【发布时间】:2020-03-20 09:43:35 【问题描述】:今天我们有一个将约会同步到 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();
我的问题:
-
这对我来说是“正确”的方法,还是我遗漏了什么?
当前的身份验证是否仍适用于本地服务器(2020 年 10 月 13 日之后)?
OAuth 身份验证是否适用于 Exchange 2010?
如果是这样,我们的客户如何获得 tentantId(我知道在哪里可以找到 o365)。
什么是令牌的 TTL?
非常感谢任何帮助/建议。
【问题讨论】:
【参考方案1】:-
是的,唯一看起来缺少的是 X-MailboxAnchor 标头(您也应该使用基本身份验证)
是的,OnPrem 不受 Office365 中所做更改的影响
不,OAuth 仅适用于已配置混合现代身份验证的 OnPrem,请参阅 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/
访问令牌的 TTL 为 60 分钟,如果您的应用程序要长时间使用令牌,EWS 托管 API 的弱点之一是它没有回调/事件,您可以在发出服务器请求时检查令牌是否过期。因此,您需要在代码逻辑中考虑这一点,或者在任何服务调用之前添加您自己的验证,或者查看修改 github 源代码并在底层代码中添加您自己的逻辑。
【讨论】:
感谢您的回复! 1:是的,我今天使用的是“X-AnchorMailbox”标题 :-) 2:完美! 3|4:谢谢,我去看看。5:好的,谢谢! (PS:我的投票没有计入,但由于是新账号,所以被记录了) 有点切题的评论,对于 O365 帐户,您最好使用守护程序 OAuth2 流而不是服务帐户。 docs.microsoft.com/en-us/archive/blogs/exchangedev/… 我们的经验中的另一个事实。 EWS over OAuth2 不适用于 Outlook.com 帐户。如果你想要 OAuth2,你需要使用 Graph API。【参考方案2】:对于您的第四个问题: 您可以配置 Azure 访问令牌生命周期并将其最长延长至 24 小时。 Link
【讨论】:
以上是关于EWS 身份验证:OAuth 的服务帐户凭据的主要内容,如果未能解决你的问题,请参考以下文章
使用 EWS 和 OAuth 2 的 Office 365 日历 API
使用服务帐户密钥对 Google Photos API 进行身份验证?
请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据 automl
具有基本身份验证的 Exchange Online 和 EWS 停止工作
FCM 推送 - 请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据