使用OAuth进行Office 365 / EWS身份验证

时间:2014-04-06 10:13:26

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

我正在尝试使用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身份验证的具体信息,我不知道如何进一步解决它,所以我希望任何人都有一些建议如何让它运作。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您可以使用OAuth连接到EWS(而不是REST),但是,它并不顺畅。 EWS需要特殊的&#34;完全访问用户的邮箱&#34; Azure Active Directory中的委派权限,需要管理员进行注册。此许可也没有“旅行”#34;在组织外部,因此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属性。

答案 2 :(得分:0)

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

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

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

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