当前位置: 首页 > 知识库问答 >
问题:

通过EWS托管API与Exchange Online通话时刷新访问令牌

秦皓君
2023-03-14

我正在编写一个应用程序,使用EWS Managed API与Exchange Online通信,并使用ADAL库通过OAuth2.0验证我的应用程序。

访问令牌在60分钟后过期。之后我需要刷新访问令牌。目前,我正在StreamSubscriptionConnection OnNotificationEvent处理程序以及OnDisconnect事件处理程序中使用以下代码刷新OAuth访问令牌。

private void OnNotificationEventHandler(object sender, NotificationEventArgs args)
{
    exchangeService.Credentials = new OAuthCredentials(GetOAuthAccessToken().Result);

    // Do my work
}
private void OnDisconnectEventHandler(object sender, SubscriptionErrorEventArgs args)
{
    exchangeService.Credentials = new OAuthCredentials(GetOAuthAccessToken().Result);
    streamingSubscriptionConnection.Open();
}

这是我的代码访问令牌。

private async Task<string> GetOAuthAccessToken(PromptBehavior promptBehavior = PromptBehavior.Auto)
{
    var authenticationContext = new AuthenticationContext(myAadTenant);

    var authenticationResult = await authenticationContext.AcquireTokenAsync(exchangeOnlineServerName, myClientId, redirectUri, new PlatformParameters(promptBehavior));

    return authenticationResult.AccessToken;
}

即使认为上面的方法“有效”,我也觉得这不是处理这种情况的最佳方法,因为每当我与EWS通信时,我都需要确保刷新我的访问令牌。如果我添加了另一个事件处理程序,而我忘记在事件处理程序中添加令牌刷新逻辑,那么如果我的访问令牌过期,但我需要在事件处理程序中调用EWS,我可能会在处理该事件时得到一个401。

上面的代码被简化了,我可以在与EWS通信时将try catch放入,如果我得到401,我会刷新我的访问令牌并再次尝试,但这并不能解决我上面提到的不便。

共有1个答案

章琛
2023-03-14

另一种方法是通过EWS托管API与Exchange online通信时,需要提供ExchangeService对象。您需要为每个请求捕获401异常,并且在获得此异常之后,您需要为ExchangeService对象重新设置Credentials属性,或者重新创建此对象。

 类似资料:
  • 我的合作伙伴提供了他们自己的日历服务,使用EWS管理的API来提取Office 365日历数据,以便在他们自己的日历应用程序中显示结果。 阅读Office 365中日历共享的文章时,它解释了第三方客户端为“我们不支持基于EWS的客户端的共享日历改进,因此您不会在任何使用EWS的日历应用程序(如Mac OS X)中看到您的共享日历。” -这是否意味着在Office 365中日历共享的更新完全实施后,

  • 我不熟悉,它代表。我混淆了它的两个术语:访问令牌和刷新令牌。 用户注册/登录站点后,我创建和。 将刷新标记保存在数据库或cookie中。 15分钟后,用户标记访问令牌过期。 如果用户空闲2小时,我将从cookie或DB中删除刷新令牌,否则我将使用刷新令牌续订访问令牌。 有什么优化的方法可以达到这个目的吗?

  • 我已经在Azure API管理中创建了一个API,用于从后端API获取数据。后端API使用带有10分钟后过期的访问令牌的oAuth2。使用返回的刷新令牌,您可以获得一个新的访问令牌,该令牌在另外10分钟内仍然有效。等等。 在Azure APIM的开发门户中,可以进行授权,这将使访问时间为10分钟。10分钟后,您必须再次手动进行授权,以便获得另外10分钟的访问权限。 在Azure APIM中是否有一

  • 我已经完成了授权步骤,并获得了访问令牌和刷新令牌。

  • 如何知道使用Exchange EWS API共享了哪个日历。

  • 目前,我正在使用https://developers.Google.com/Calendar/quickstart/php这个api,但是令牌在3-4小时后到期,如何自动刷新谷歌日历api的访问令牌 当前代码为: