2014-11-22 69 views
1

我想通过Azure AD使用EWS托管Api与Office 365 API。到目前为止,我已完成了以下任务。在Office 365 API中使用EWS托管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); 

编辑:我正在成功获取accessToken并使用它来针对EWS托管的Api进行调用,但它以403:Forbidden异常失败。您的帮助将受到高度赞赏。

最好的问候,

+0

[Office 365/EWS身份验证使用OAuth]的可能重复(http://stackoverflow.com/questions/22892650/office-365-ews-authentication-using-oauth) – tatigo 2015-08-06 15:58:53

回答

2

杰森·约翰斯顿帮我解决我的问题。 链接:
Office 365/EWS Authentication using OAuth: The audience claim value is invalid

我查了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没有。我要求开发人员确认这一点,也许我做错了什么,但是现在我的问题已经解决了。

0

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

+0

感谢您确认这一点。 :) – User 2014-11-25 14:49:31