如何使用OAuth进行身份验证以访问EWS API

tav*_*ier 5 c# oauth exchangewebservices

我的网络服务目前正在进行基本的用户名/密码认证,以便订阅交换用户接收事件(如新邮件事件等),如下所示:

var service = new ExchangeService(exchangeVersion)
                                  {
                                      KeepAlive = true,
                                      Url = new Uri("some autodiscovery url"),
                                      Credentials = new NetworkCredential(username, password)
                                  };

var subscription = service.SubscribeToPushNotifications(
                                    new[] { inboxFolderFoldeID },
                                    new Uri("some post back url"),
                                    15,
                                    null,
                                    EventType.NewMail,
                                    EventType.Created,
                                    EventType.Deleted,
                                    EventType.Modified,
                                    EventType.Moved,
                                    EventType.Copied);
Run Code Online (Sandbox Code Playgroud)

现在,我应该更换身份验证机制以使用OAuth协议.我看到了一些例子,但他们似乎都在谈论验证客户端(https://msdn.microsoft.com/en-us/library/office/dn903761%28v=exchg.150%29.aspx?f=255&MSPPError = -2147217396)但我无法找到如何使用OAuth协议验证交换用户的示例.任何代码示例都会有很大帮助.谢谢.

huy*_*itw 5

目前尚不清楚“网络服务”的含义以及您目前如何获取用户名和密码。如果这是用户需要登录或传递凭据的某种网站,那么您必须从浏览器启动 OAuth2 授权,就像将客户端浏览器重定向到授权端点以启动隐式授权代码授权一样。用户将在 OAuth2 服务器上(而不是在您的应用程序中)看到一个登录屏幕,一旦用户登录代码或访问令牌(取决于授权)将返回到您的应用程序,您可以在ExchangeService构造函数中使用它。

如果该“网络”服务是在用户计算机上运行的某些服务,您可以使用下面描述的方法之一。

使用 AuthenticationContext 获取 AccessToken

该示例似乎基于AuthenticationContext该类的旧版本。

其他版本似乎是较新的,也是AcquireToken现在改名为AcquireTokenAsync/ AcquireTokenSilentAsync

无论您使用的是哪个版本,您都无法像在当前代码中那样传递用户名和密码。但是,您可以让该AcquireToken[Async]方法提示用户输入凭据。老实说,这比让您的应用程序直接处理这些用户机密更安全。在您知道之前,您将在数据库中存储纯文本密码(希望您还没有这样做)。

在这两个版本中,这些方法都有很多重载,它们都有不同的参数和略有不同的功能。对于您的用例,我认为这些很有趣:

在两个版本中,提示行为 auto 意味着:当凭据尚未缓存时,将要求用户提供凭据。两个AuthenticationContext构造函数都允许您传递令牌缓存,您可以自己实现它以在内存、文件或数据库中缓存令牌(请参阅本文以获取示例文件缓存实现)。

手动获取AccessToken

如果您真的想在不提示用户的情况下从代码中传递用户凭据,总有办法解决。在这种情况下,您必须实现OAuth2 规范/RFC6749 中概述的资源所有者密码凭据授权

不管是否巧合,我有一个名为 的开源库oauth2-client-handler,它实现了与 一起使用HttpClient,但无论如何,如果您想走这条路,您可以深入研究该代码,尤其是从该方法开始。

使用访问令牌

获得访问令牌后,您可以继续使用此 MSDN 页面上的示例,fe:

var service = new ExchangeService(exchangeVersion)
                  {
                      KeepAlive = true,
                      Url = new Uri("some autodiscovery url"),
                      Credentials = new OAuthCredentials(authenticationResult.AccessToken))
                  };
Run Code Online (Sandbox Code Playgroud)


tav*_*ier 4

以防有人仍在努力让它发挥作用。我们需要在 Azure 门户上为应用程序上传证书清单,然后使用相同的证书对客户端进行身份验证以获取访问令牌。有关更多详细信息,请参阅:https://blogs.msdn.microsoft.com/exchangedev/2015/01/21/building-daemon-or-service-apps-with-office-365-mail-calendar-and-contacts- apis-oauth2-客户端凭证流/