【问题标题】:Office 365 / EWS Authentication using OAuth使用 OAuth 的 Office 365 / EWS 身份验证
【发布时间】:2016-11-25 21:11:21
【问题描述】:

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

我能够使用连接到 Office 365 Web API (REST),因此我确实拥有来自 Active Directory 身份验证库 (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 -> <Trace Tag="EwsResponseHttpHeaders" Tid="11" Time="2014-04-06 10:06:39Z">
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 身份验证的具体信息,我不知道如何进一步解决它,所以我希望任何人有一些建议关于如何让它工作。

【问题讨论】:

标签: c# oauth-2.0 ms-office exchangewebservices


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    假设您获得了分配的权限,我通过两种方式完成了这项工作。

    1. 最简单的:只需将您返回的令牌添加到授权标头中的请求标头中,如下所示:

      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 属性。

    【讨论】:

    • 分配了“对用户邮箱具有完全访问权限(预览版)”。是的,我知道它需要管理员权限,这没关系。该应用程序将仅由管理员操作,它不是最终用户应用程序。
    • 嗯,好的。然后我怀疑 TokenCredentials 类没有做正确的事情。您是否查看过网络跟踪并确认令牌是在 Authorization: Bearer 标头中发送的?
    • 我没有。我会看到我可以捕捉到痕迹并回复你
    • 我查看了那个 TokenCredentials 类,但这不是要走的路。不久前添加了该类以支持 SAML 令牌,而不是 OAuth。我将在上面提供更多信息来完善我的答案。
    • 仅供参考:Fiddler 跟踪显示它没有在 Authorization: Bearer 标头中使用令牌,但它是 EWS 请求本身的一部分。 (或者确切地说是 SOAP 标头)
    【解决方案3】:

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

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

    旧模型在某些方面很可爱,因为您没有绑定到 aad oauth,对于您自己的应用程序,只有在与 microsoft 属性通信时才绑定到 aad 土地。如果有人通过 openid connect 拥有一个供应商移动令牌(一个 tgt,除了名称之外的所有内容),也许我可以忍受一些相互依赖。

    所以我有一个 aad (netmagic.onmicrosoft.com),带有认证域注册 (rapmlsqa.com)。我要不要在 aad 中制作一个 webapi 类应用程序,分配那个 office 权限?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多