案例:呼叫 Web API 的 Web API (代理者案例)
瞭解如何建置可代表使用者呼叫另一個 Web API 的 Web API。
概觀
用戶端 (Web 應用程式) - 未呈現在下圖中 - 呼叫受保護 Web API,並在其 "Authorization" Http 標頭中提供 JWT 持有人權杖。
受保護 Web API 會驗證權杖,並使用 MSAL AcquireTokenOnBehalfOf 方法來要求另一個權杖 (來自 AD FS),讓它本身可以代表使用者來呼叫第二個 Web API (名為下游 Web API)。
受保護 Web API 會使用此權杖來呼叫下游 API。 它也可以呼叫 AcquireTokenSilentlater 來要求其他下游 API 的權杖 (但仍然代表相同的使用者)。 AcquireTokenSilent 會視需要重新整理權杖。
若要進一步了解如何在 AD FS 中設定代理者驗證案例,請使用此處提供的範例,並逐步進行應用程式註冊和程式碼設定步驟。
必要條件
- GitHub 用戶端工具
- 已設定且正在執行的 AD FS 2019 或更新版本
- Visual Studio 2013 或更新版本
AD FS 中的應用程式註冊
本節顯示如何在 AD FS 中將原生應用程式註冊為公用用戶端以及將 Web API 註冊為信賴憑證者 (RP)
在 [AD FS 管理] 中,以滑鼠右鍵按一下 [應用程式群組],然後選取 [新增應用程式群組]。
在 [應用程式群組精靈] 上,針對 [名稱] 輸入 [WebApiToWebApi],然後在 [用戶端伺服器應用程式] 下方選取 [存取 Web API 的原生應用程式] 範本。 按一下 [下一步] 。
複製 [用戶端識別碼] 值。 稍後會在應用程式的 App.config 檔案中,將其用作 ClientId 的值。 針對 [重新導向 URI:],輸入下列內容 - https://ToDoListClient. 按一下新增。 按一下 [下一步] 。
在 [設定 Web API] 畫面上,輸入 [識別碼:]https://localhost:44321/. 按一下新增。 按一下 [下一步] 。 稍後將會在應用程式的 App.config 和 Web.config 檔案中使用此值。
在 [套用存取控制原則] 畫面上,選取 [允許所有人],然後按 [下一步]。
在 [設定應用程式權限] 畫面上,選取 [openid] 和 [user_impersonation]。 按一下 [下一步] 。
在 [摘要] 畫面上,按 [下一步]。
在 [完成] 畫面上,按一下 [關閉]。
在 [AD FS 管理] 中,按一下 [應用程式群組],然後選取 [WebApiToWebApi] 應用程式群組。 按一下滑鼠右鍵並選取 [內容]。
在 [WebApiToWebApi 內容] 畫面上,按一下 [新增應用程式…]。
在 [獨立應用程式] 下方,選取 [伺服器應用程式]。
在 [伺服器應用程式] 畫面上,將 https://localhost:44321/ 新增為 [用戶端識別碼] 和 [重新導向 URI]。
在 [設定應用程式認證] 畫面上,選取 [產生共用秘密]。 複製秘密以供稍後使用。
在 [摘要] 畫面上,按 [下一步]。
在 [完成] 畫面上,按一下 [關閉]。
在 [AD FS 管理] 中,按一下 [應用程式群組],然後選取 [WebApiToWebApi] 應用程式群組。 按一下滑鼠右鍵並選取 [內容]。
在 [WebApiToWebApi 內容] 畫面上,按一下 [新增應用程式…]。
在 [獨立應用程式] 下方,選取 [Web API]。
在 [設定 Web API] 上,將 https://localhost:44300 新增為 [識別碼]。
在 [套用存取控制原則] 畫面上,選取 [允許所有人],然後按 [下一步]。
在 [設定應用程式權限] 畫面上,按 [下一步]。
在 [摘要] 畫面上,按 [下一步]。
在 [完成] 畫面上,按一下 [關閉]。
在 [WebApiToWebApi – Web API 2 內容] 畫面上,按一下 [確定]
在 [WebApiToWebApi 內容] 畫面上,選取 [WebApiToWebApi – Web API],然後按一下 [編輯...]。
在 [WebApiToWebApi – Web API 屬性] 畫面上,選取 [發行轉換規則] 索引標籤,然後按一下 [新增規則...]。
在 [新增轉換宣告規則精靈] 上,從下拉式清單中選取 [使用自訂規則傳送宣告],然後按 [下一步]。
在 [宣告規則名稱:] 欄位中輸入 PassAllClaims,並在 [自訂規則:] 欄位中輸入 [x:[] => issue(claim=x);] 宣告規則,然後按一下 [完成]。
在 [WebApiToWebApi – Web API 內容] 畫面上,按一下 [確定]
在 [WebApiToWebApi 內容] 畫面上,選取 [WebApiToWebApi – Web API 2],然後按一下 [編輯...]
在 [WebApiToWebApi – Web API 2 內容] 畫面上,選取 [發行轉換規則] 索引標籤,然後按一下 [新增規則...]
在 [新增轉換宣告規則精靈] 上,從下拉式清單中選取 [使用自訂規則傳送宣告],然後按 [下一步]
在 [宣告規則名稱:] 欄位中輸入 PassAllClaims,並在 [自訂規則:] 欄位中輸入 [x:[] => issue(claim=x);] 宣告規則,然後按一下 [完成]。
依序在 [WebApiToWebApi – Web API 2 內容] 畫面和 [WebApiToWebApi 內容] 畫面上,按一下 [確定]。
程式碼設定
本節顯示如何設定 Web API 來呼叫另一個 Web API
從此處下載範例
使用 Visual Studio 來開啟範例
開啟 App.config 檔案。 修改下列項目:
ida:Authority - 輸入 https://[your AD FS hostname]/adfs/
ida:ClientId - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #3 的值。
ida:RedirectUri - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #3 的值。
todo:TodoListResourceId – 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #4 的「識別碼」值
ida: todo:TodoListBaseAddress - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #4 的「識別碼」值。
在 ToDoListService 下方,開啟 Web.config 檔案。 修改下列項目:
ida:Audience - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #12 的「用戶端識別碼」值
ida:ClientId - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #12 的「用戶端識別碼」值。
Ida: ClientSecret - 在上述 [AD FS 中的應用程式註冊] 區段中輸入從 #13 所複製的共用秘密。
ida:RedirectUri - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #12 的 RedirectUri 值。
ida: AdfsMetadataEndpoint - 輸入 https://[your AD FS hostname]/federationmetadata/2007-06/federationmetadata.xml
ida:OBOWebAPIBase - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #19 的「識別碼」值。
ida:Authority - 輸入 https://[your AD FS hostname]/adfs
在 WebAPIOBO 下方,開啟 Web.config 檔案。 修改下列項目:
ida: AdfsMetadataEndpoint - 輸入 https://[your AD FS hostname]/federationmetadata/2007-06/federationmetadata.xml
ida:Audience - 在上述 [AD FS 中的應用程式註冊] 區段中輸入來自 #12 的「用戶端識別碼」值
測試範例
本節顯示如何測試上面所設定的範例。
變更程式碼之後,請重新建置解決方案
在 Visual Studio 上,以滑鼠右鍵按一下解決方案,然後選取 [設定啟動專案...]
在 [內容] 頁面上,確定已針對每個專案 (TodoListSPA 除外) 將 [動作] 設定為 [開始]。
在 Visual Studio 頂端,按一下綠色箭號。
在原生應用程式的 [主要] 畫面上,按一下 [登入]。
如果您看不到原生應用程式畫面,則請從系統上專案存放庫儲存所在的資料夾搜尋和移除 *msalcache.bin 檔案。
系統會將您重新導向至 AD FS 登入頁面。 繼續並登入。
登入之後,請在 [建立待辦事項] 中輸入文字 [Web Api 對 Web Api 呼叫]。 按一下 [新增項目]。 這將會呼叫可接著呼叫 Web API 2 (WebAPIOBO) 的 Web API (待辦事項服務),並在快取中新增項目。