将 EWS 托管 API 与 Office 365 API 结合使用

本文关键字:API 结合 EWS 托管 Office | 更新日期: 2023-09-27 18:31:33

我正在尝试通过Azure AD将EWS托管API与Office 365 API一起使用。到目前为止,我已经完成了以下任务。

  • 我在 Azure AD 中具有管理员权限。
  • 我已成功在 Azure AD 中注册我的应用程序。
  • 我从 Azure AD 获取了客户端 ID、应用密钥和资源 ID。
  • 我已启用"对用户邮箱具有完全访问权限。正如杰森所建议的那样。
  • 我已经成功地创建了一个MVC5 Web应用程序。
  • 我关注了杰里米的这篇博文。

这是我关注的博客链接:http://www.jeremythake.com/2014/08/using-the-exchange-online-ews-api-with-office-365-api-via-azure-ad/#comment-280653

控制器中的代码:

   var outlookClient = await AuthHelper.EnsureOutlookServicesClientCreatedAsync("Mail");
    IPagedCollection<IMessage> messagesResults = await     outlookClient.Me.Messages.ExecuteAsync();
    string messageId = messagesResults.CurrentPage[0].Id;
    string tokenx = AuthHelper.GetSessionToken();
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
    service.HttpHeaders.Add("Authorization", "Bearer " + tokenx);
    service.PreAuthenticate = true;
    service.SendClientLatencies = true;
    service.EnableScpLookup = false;
    service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
    ExFolder rootfolder = ExFolder.Bind(service, WellKnownFolderName.MsgFolderRoot);

已编辑:我已成功获取访问令牌并使用它来调用 EWS 托管的 API,但它失败并出现 403:禁止异常。您的帮助将不胜感激。

此致敬意

将 EWS 托管 API 与 Office 365 API 结合使用

Jason Johnston帮助我解决了我的问题。链接:
使用 OAuth 的 Office 365/EWS 身份验证:访问群体声明值无效

我检查了 EWS 跟踪,我了解到 EWS 抱怨令牌无效且权限不足。我已将应用程序重新注册到 Azure AD,并启用了对邮箱的完全访问权限。

我在下面的代码中对此进行了注释。

//var outlookClient = await AuthHelper.EnsureOutlookServicesClientCreatedAsync("Mail");
        //try
        //{
        //    IPagedCollection<IMessage> messagesResults = await outlookClient.Me.Messages.ExecuteAsync();
        //    string messageId = messagesResults.CurrentPage[0].Id;
        //}
        //catch
        //{
        //    System.Diagnostics.Debug.WriteLine("Something bad happened. !!");
        //}  

我正在从下面的链接示例中获取访问令牌。https://github.com/OfficeDev/Office-365-APIs-Starter-Project-for-ASPNETMVC

这是执行身份验证主要任务的控制器的完整代码。

string resourceUri = "https://outlook.office365.com";
        var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
        var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
        AuthenticationContext authContext = new AuthenticationContext(Settings.Authority, new NaiveSessionCache(signInUserId));
        string tokenx = await AuthHelper.AcquireTokenAsync(authContext, resourceUri, Settings.ClientId, new UserIdentifier(userObjectId,UserIdentifierType.UniqueId));
        System.Diagnostics.Debug.WriteLine("Token:" + tokenx);
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
            service.TraceListener = new EwsTrace();
            service.TraceEnabled = true;
            service.TraceFlags = TraceFlags.All;
            service.HttpHeaders.Add("Authorization", "Bearer " + tokenx);
            service.PreAuthenticate = true;
            service.SendClientLatencies = true;
            service.EnableScpLookup = false;
            service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
            ExFolder rootfolder = ExFolder.Bind(service, WellKnownFolderName.MsgFolderRoot);
        Console.WriteLine("The " + rootfolder.DisplayName + " has " + rootfolder.ChildFolderCount + " child folders.");

注意到的重要一点是我不能使用相同的令牌来访问 office365 api 和 EWS 托管的 API,因为 EWS 使用完全邮箱访问权限,而 office365 则不然。我要求开发人员确认这一点,也许我做错了什么,但是我的问题现在已经解决了。

是的,没错。EWS 所需的范围与 Office 365 API 不兼容,反之亦然。