使用OAuth进行Office 365 / EWS身份validation

我正在尝试使用OAuth和EWS托管API登录Office 365 Exchange Online。

我可以使用连接到Office 365 Web API(REST),因此我从Active Directory身份validation库(ADAL)获得了有效的令牌。

现在,我正在尝试使用EWS和TokenCredentials进行连接。

我认为代码非常简单:

public static ExchangeService ConnectToServiceWithImpersonation(string token) { var service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); if (true) { service.TraceListener = new TraceListener(); service.TraceFlags = TraceFlags.All; service.TraceEnabled = true; } var credentials = new TokenCredentials(token); service.Credentials = credentials; service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx"); return service; } 

该令牌由ADAL生成,而ADAL又使用“Office 365 API工具 – 预览”来自示例代码

 // Obtain information for communicating with the service: Office365ServiceInfo serviceInfo = Office365ServiceInfo.GetExchangeServiceInfo(); if (!serviceInfo.HasValidAccessToken) { return Redirect(serviceInfo.GetAuthorizationUrl(Request.Url)); } // Connect to Exchange var service = ConnectToServiceWithImpersonation(serviceInfo.AccessToken); Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox); 

在Folder.Bind调用中,我收到401 Unauthorized错误。 EWS Trace给了我这个:

 2014-04-06 12:06:39.2012 TRACE ExchangeWebServices: EwsResponseHttpHeaders ->  HTTP/1.1 401 Unauthorized request-id: 01ba1ca9-2850-480a-9d65-ec55bfef8657 X-CasErrorCode: BadSamlToken X-FEServer: AMSPR04CA018 Content-Length: 0 Cache-Control: private Date: Sun, 06 Apr 2014 10:06:39 GMT Server: Microsoft-IIS/7.5 WWW-Authenticate: Basic Realm="" X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET 

不幸的是,几小时的谷歌搜索没有真正的帮助,似乎没有关于EWS和OAuth认证的非常具体的信息,我不知道如何进一步解决它,所以我希望任何人都有一些建议如何让它工作。

TokenCredentials不是在此示例中使用的正确类。 就像杰森提到的那样,出于其他原因。 作为注释并澄清使用此和/或SAML令牌将无法在Exchange Online中使用EWS。 仅支持基于OAuth的访问。 为了完成这项工作,我们在EWS托管API中放置了OAuthCredentials类。 在您的代码中,您可以“var credentials = new OAuthCredentials(token)”。 请注意,EWS Soap仅支持完整的“user_impersonation”/“对用户邮箱的完全访问权限”权限。 Calendar.Read等详细权限仅适用于EWS Rest API。 虽然“完全邮箱访问”需要管理员同意,但其他租户的管理员可以同意,因为它是一个Web应用程序。 如果您要开发本机应用程序,则必须在其运行的租户的应用程序中直接注册该应用程序才能使用“完全邮箱访问”。

您可以使用OAuth连接到EWS(而不是REST),但是,它并不是那么顺利。 EWS需要Azure Active Directory中特殊的“具有对用户邮箱的完全访问权限”委派权限,这需要管理员进行注册。 此权限也不会在组织外“旅行”,因此EWS没有用户同意的方案。 从本质上讲,这适用的唯一方案是管理员为您自己的组织注册应用程序。

检查Azure中的应用程序注册,并确保已分配该权限。

假设您已获得许可,我已经以两种方式完成了这项工作。

  1. 最简单的方法:只需将您获得的令牌添加到Authorization标头中的请求标头中,如下所示:

     ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); string accessToken = GetAccessToken(); if (!string.IsNullOrEmpty(accessToken)) service.HttpHeaders.Add("Authorization", "Bearer " + accessToken); 
  2. 更复杂:实现您自己的实现ICredentials接口的凭证类。 将此类传递给Microsoft.Exchange.WebServices.Data.OAuthCredentials类的构造函数,并将新的OAuthCredentials对象分配给ExchangeService对象的Url属性。

如果来自aad的认证域,您可以使用saml,并使用ms online sts交换该令牌。 我做到了这一点,并且很容易在网上找到我的文章。

有兴趣将其全部转储,现在使用aad问题访问令牌。

较旧的模型在某些方面很可爱,因为你不依赖于aad oauth,对于你自己的应用程序,只与微软属性交谈时与aad land绑在一起。 如果有一个使用openid connect的供应商移动令牌(tgt,除了名称之外),也许我可以忍受一些相关性。

所以我有一个aad(netmagic.onmicrosoft.com),带有认证域名注册(rapmlsqa.com)。 我是否可以在aad中制作一个webapi类应用程序,分配办公室权限?