使用EWS托管API的Web API的正确OAuth2身份验证流程

时间:2016-12-19 23:50:09

标签: asp.net api azure authentication oauth

我一直在阅读大量有关在Azure AD中使用OAuth的文档,但我仍然对如何正确实现我的情况感到困惑。希望有人能引导我朝着正确的方向前进。

我创建了一个ASP.NET Web API应用程序,它使用EWS托管API代表不同用户访问Exchange。我的应用程序公开端点,例如/Mailbox/Messages/Appointments,意图是某些前端Web应用程序最终将使用它们来检索用户的电子邮件和约会。目前,端点正在使用基本的http身份验证,但我想更新它们以使用OAuth。该应用程序已在我的Azure AD实例中注册,并且我已将其配置为要求“通过Exchange Web服务访问邮箱作为登录用户”API权限。

由于前端尚未实现,我一直在尝试通过手动调用身份验证端点进行测试。这会提示我登录并提供同意。如果我同意,我会被重定向到我在使用查询参数中包含的授权代码注册应用程序时提供的回调URL。我仍然不太确定我应该如何使用这个回调,但为了测试我目前有回调兑换访问令牌的授权码。这是通过在AcquireTokenByAuthorizationCode类的实例上调用AuthenticationContext方法并提供我的应用程序的id和机密来完成的。同样,为了测试,我将访问令牌返回给浏览器。然后,我可以使用此访问令牌调用上述端点(经过一些修改)并获取用户的电子邮件。我猜这很多都不是做事的正确方法。

我的一些困惑点:

  1. 我在Azure AD中注册的回调在获取授权代码时应该做什么?这是否适用于不同类型的应用程序?也许这不只是扮演中间人的角色。
  2. 我正在尝试使我的应用程序有点RESTful,所以我不想在请求之间维护访问令牌。因此,我的端点是否有理由期望在每个请求的身份验证标头中提供访问令牌?如果是这样,这是否意味着前端应用程序应负责获取访问令牌并将其传递给我?
  3. 对OAuth和Azure完全陌生,我不确定是否有任何其他细节相关,但我可以根据需要提供更多信息。

1 个答案:

答案 0 :(得分:1)

您正在实施的是此方案:https://docs.microsoft.com/en-us/azure/active-directory/active-directory-authentication-scenarios#daemon-or-server-application-to-web-api

以下是它的工作原理:

  1. 您的客户端应用重定向用户以在授权端点登录
  2. 您的客户端应用程序获取授权代码(如果使用授权代码授权流程,则还有其他代码)
  3. 客户端应用会为您的API应用交换访问令牌的代码
    1. 它需要提供其客户端ID和密码以及代码和API的资源URI才能获得它
  4. 客户端应用调用您的API应用,在授权标题
  5. 中传递访问令牌
  6. 然后,您的API应用验证访问令牌,并从Azure AD请求另一个访问令牌以获取Exchange API
    1. 它会将客户端应用程序发送的访问令牌及其客户端ID和密码以及Exchange API的资源URI传递给Azure AD
  7. 您的API应用会收到一个访问令牌,因此您可以以用户身份调用Exchange API
  8. 回答你的两个问题:

    1. 授权代码流不与API一起使用,仅与用户登录的应用程序一起使用,因此重定向URL基本上从不使用
    2. 您的API可以而且必须预期并验证每个请求中 it 的访问令牌。但是它用于调用Exchange API的访问令牌可以并且应该缓存在API的一侧。这是开箱即用的ADAL,虽然令牌只在内存中。