2016-12-19 52 views
0

我一直在閱讀大量有關在Azure AD中使用OAuth的文檔,但我仍然完全困惑於如何正確實施我的情況。希望有人能引導我走向正確的方向。使用EWS託管API的Web API的正確OAuth2身份驗證流程

我已經創建了一個ASP.NET Web API應用程序,它使用EWS託管API代表不同用戶訪問Exchange。我的應用程序公開了端點,如/Mailbox/Messages/Appointments,意圖是某些前端Web應用程序最終將使用它們來檢索用戶的電子郵件和約會。目前端點正在使用基本的http認證,但我想更新它們以使用OAuth。該應用程序已在我的Azure AD實例中註冊,並且已將其配置爲要求「通過Exchange Web服務訪問郵箱作爲已登錄用戶」API權限。

由於前端尚未實現,我一直試圖通過手動調用認證端點進行測試。這提示我登錄並提供同意。如果我同意,我將被重定向到我使用查詢參數中包含的授權代碼註冊應用程序時提供的回調URL。我仍然不太清楚應該如何使用此回調函數,但爲了測試目的,我現在使用回調函數將授權代碼兌換爲訪問令牌。這是通過在AuthenticationContext類的實例上調用AcquireTokenByAuthorizationCode方法並提供我的應用程序的ID和祕密來完成的。同樣,爲了測試的目的,我將訪問令牌返回給瀏覽器。然後,我可以使用此訪問令牌(經過一些修改)調用前述端點並獲取用戶的電子郵件。我猜這很多不是做事的正確方法。

我的一些困惑點:

  1. 我應該說我在Azure的AD註冊的回調實際上是這樣做時,它得到的授權碼?這是否適用於不同類型的應用程序?也許不只是扮演中間人的角色。
  2. 我試圖讓我的應用程序有些RESTful,所以我不想在請求之間維護我的端上的訪問令牌。因此,對於我的端點而言,期望每個請求的驗證頭中都提供訪問令牌是否有意義?如果是這樣,這是否意味着前端應用程序應負責獲取訪問令牌並將其傳遞給我?

作爲OAuth和Azure的全新手機,我不確定是否有其他細節是相關的,但我可以根據需要提供更多信息。

回答

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應用程序,通過訪問令牌的Authorization頭
  5. 你的API應用程序,然後驗證訪問令牌,併爲請求從Azure的AD另一個訪問令牌爲Exchange API
    1. 將路過的客戶端應用程序發送的訪問令牌,其客戶一起ID和祕密和Exchange API的資源URI天青AD
  6. 你的API應用程序接收到一個訪問令牌,所以你可以打電話到Exchange API爲用戶

並回答你的兩個問題:

  1. 授權碼流不與API一起使用,只能與一個用戶登錄的應用程序,從而重定向URL基本上是從未使用過
  2. 你的API能夠而且必須期待和驗證的訪問令牌在每個請求。但是它用來調用Exchange API的訪問令牌可以並且應該緩存在API的一端。這是ADAL提供的開箱即用功能,雖然令牌只在內存中。