方案:调用 Web API 的 Web API(代表方案)

了解如何生成代表用户调用另一个 Web API 的 Web API。

在阅读本文之前,应熟悉 AD FS 概念On-Behalf_Of 流

概述

  • 客户端(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 中的应用注册

本部分介绍如何将本机应用注册为公共客户端,并将 Web API 注册为 AD FS 中的信赖方 (RP)

  1. 在”AD FS管理”中,右键单击“应用程序组”,然后选择“添加应用程序组” 。

  2. 在应用程序组向导中,对于“名称”,输入“ebApiToWebApi”,并在“客户端-服务器应用程序”下选择”访问 Web API 模板的本机应用程序”。 单击“下一步”。

    “添加应用程序组”向导的欢迎页的屏幕截图,其中突出显示了访问 Web API 模板的本机应用程序。

  3. 复制“客户端标识符”值。 稍后,它将在应用程序的 App.config 文件中用作 ClientId 的值。 为“重定向 URI”输入以下内容:https://ToDoListClient. 单击“添加”。 单击“下一步”。

    “添加应用程序组”向导的“本机应用程序”页面的屏幕截图,其中显示了重定向 URI。

  4. 在“配置 Web API”屏幕上,输入标识符:https://localhost:44321/. 单击 添加。 单击“下一步”。 此值稍后将在应用程序的 App.config 和 Web.Config 文件中使用。

    “添加应用程序组”向导的“配置 Web API”页面的屏幕截图,其中显示了正确的标识符。

  5. 在“应用访问控制策略”屏幕上,选择“允许所有人”,然后单击“下一步”。

    “添加应用程序组”向导的“选择访问控制策略”页面的屏幕截图,其中突出显示了“允许所有人”选项。

  6. 在“配置应用程序权限”屏幕上,选择“openid”和“user_impersonation”。 单击“下一步”。

    “添加应用程序组”向导的“配置应用程序权限”页面的屏幕截图,其中显示已选中“openid”。

  7. 在“摘要”屏幕中,单击“下一步”。

  8. 在“完成”屏幕上,单击“关闭”。

  9. 在“AD FS 管理”中,单击“应用程序组”,然后选择“WebApiToWebApi”应用程序组。 右键单击并选择“属性”

    “ADFS 管理”对话框的屏幕截图,其中突出显示了 WebApiToWebApi 组,还显示了下拉列表中的“属性”选项。

  10. 在 WebApiToWebApi 属性屏幕上,单击“添加应用程序…”。

    “WebApiToWebApi 属性”对话框的屏幕截图,其中显示了列出的 WebApiToWebApi - Web API 应用程序。

  11. 在“独立应用程序”下,选择“服务器应用程序”。

    “将新应用程序添加到 WebApiToWebApi”向导的欢迎页的屏幕截图,其中突出显示了“服务器应用程序”选项。

  12. 在“服务器应用程序”屏幕上,添加 https://localhost:44321/ 作为客户端标识符和重定向 URI。

    “将新应用程序添加到 WebApiToWebApi”向导的“服务器应用程序”页面的屏幕截图,其中显示了正确的客户端标识符和重定向 URI。

  13. 在“配置应用程序凭据”屏幕上,选择“生成共享机密”。 复制机密供稍后使用。

    “将新应用程序添加到 WebApiToWebApi”向导的“配置应用程序凭据”应用程序页的屏幕截图,其中显示已选中“生成共享机密”选项,并突出显示了生成的共享机密。

  14. 在“摘要”屏幕中,单击“下一步”。

  15. 在“完成”屏幕上,单击“关闭”。

  16. 在“AD FS 管理”中,单击“应用程序组”,然后选择“WebApiToWebApi”应用程序组。 右键单击并选择“属性”

    “ADFS 管理”对话框的第二个屏幕截图,其中突出显示了 WebApiToWebApi 组,还显示了下拉列表中的“属性”选项。

  17. 在 WebApiToWebApi 属性屏幕上,单击“添加应用程序…”。

    “WebApiToWebApi 属性”对话框的第二个屏幕截图,其中显示了列出的 WebApiToWebApi - Web API 应用程序。

  18. 在“独立应用程序”下,选择“Web API”。

    “将新应用程序添加到 WebApiToWebApi”向导的欢迎页的屏幕截图,其中突出显示了“Web API”选项。

  19. 在“配置 Web API”上,添加 https://localhost:44300 作为标识符。

    “将新应用程序添加到 WebApiToWebApi”向导的“配置 Web API”页的屏幕截图,其中显示了正确的重定向 URI。

  20. 在“应用访问控制策略”屏幕上,选择“允许所有人”,然后单击“下一步”。

    “将新应用程序添加到 WebApiToWebApi”向导的“选择访问控制策略”页面的屏幕截图,其中突出显示了“允许所有人”选项。

  21. 在“配置应用程序权限”屏幕上,单击“下一步”。

    “将新应用程序添加到 WebApiToWebApi”向导的“配置应用程序权限”页的屏幕截图,其中显示了已调出的“下一步”选项。

  22. 在“摘要”屏幕中,单击“下一步”。

  23. 在“完成”屏幕上,单击“关闭”。

  24. 在“WebApiToWebApi - Web API 2 属性”屏幕上单击“确定”

  25. 在“WebApiToWebApi 属性”屏幕上,选择“WebApiToWebApi - Web API”,然后单击“编辑...”。

    “WebApiToWebApi 属性”对话框的屏幕截图,其中突出显示了 WebApiToWebApi - Web API 应用程序。

  26. 在“WebApiToWebApi - Web API 属性”屏幕上,选择“颁发转换规则”选项卡,然后单击“添加规则...”。

    “WebApiToWebApi - Web API 属性”对话框的屏幕截图,其中显示了“颁发转换规则”选项卡。

  27. 在“添加转换声明规则”向导的下拉列表中,选择“使用自定义规则发送声明”,然后单击“下一步”。

    “添加转换声明规则”向导的“选择规则模板”页的屏幕截图,其中显示已选中“使用自定义规则发送声明”选项。

  28. 在“声明规则名称:”字段中输入“PassAllClaims”,在“自定义规则:”字段中输入“x:[] => issue(claim=x);”,然后单击“完成”。

    “添加转换声明规则”向导的“配置规则”页的屏幕截图,其中显示了上述配置。

  29. 在“WebApiToWebApi - Web API 属性”屏幕上单击“确定”

  30. 在“WebApiToWebApi 属性”屏幕上,选择“WebApiToWebApi - Web API 2”,然后单击“编辑...”
    “WebApiToWebApi 属性”对话框的屏幕截图,其中突出显示了 WebApiToWebApi - Web API 2 应用程序。

  31. 在“WebApiToWebApi - Web API 2 属性”屏幕上,选择“颁发转换规则”选项卡,然后单击“添加规则...”

  32. 在“添加转换声明规则”向导上,从下拉列表中选择“使用自定义规则发送声明”,然后单击“下一步”“添加转换声明规则”向导的“选择规则模板”页的第二个屏幕截图,其中显示已选中“使用自定义规则发送声明”选项。

  33. 在“声明规则名称:”字段中输入“PassAllClaims”,在“自定义规则:”字段中输入“x:[] => issue(claim=x);”,然后单击“完成”。

    “添加转换声明规则”向导的“配置规则”页的第二个屏幕截图,其中显示了上述配置。

  34. 在“WebApiToWebApi - Web API 2 属性”屏幕上单击“确定”,然后在“WebApiToWebApi 属性”屏幕上单击“确定”。

代码配置

本部分介绍如何配置 Web API 来调用另一个 Web API

  1. 此处下载示例

  2. 使用 Visual Studio 打开示例

  3. 打开 App.config 文件。 修改以下内容:

    • ida:Authority - 输入 https://[AD FS 主机名]/adfs/

    • ida:ClientId - 在上面的“AD FS 中的应用注册”部分输入来自 #3 的值。

    • ida:RedirectUri - 在上面的“AD FS 中的应用注册”部分输入来自 #3 的值。

    • todo:TodoListResourceId - 在上面的“AD FS 中的应用注册”部分输入来自 #4 的标识符值

    • ida: todo:TodoListBaseAddress - 在上面的“AD FS 中的应用注册”部分输入来自 #4 的标识符值。

      应用配置文件的屏幕截图,其中显示了修改后的值。

  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://[AD FS 主机名]/federationmetadata/2007-06/federationmetadata.xml

    • ida:OBOWebAPIBase - 在上面的“AD FS 中的应用注册”部分输入来自 #19 的标识符值。

    • ida:Authority - 输入 https://[AD FS 主机名]/adfs

      ToDoListService 下的 Web 配置文件的屏幕截图,其中显示了修改后的值。

  5. 在 WebAPIOBO 下打开 Web.config 文件。 修改以下内容:

    • ida: AdfsMetadataEndpoint - 输入 https://[AD FS 主机名]/federationmetadata/2007-06/federationmetadata.xml

    • ida:Audience - 在上面的“AD FS 中的应用注册”部分输入来自 #12 的客户端标识符值

      WebAPIOBO 下的 Web 配置文件的屏幕截图,其中显示了修改后的值。

测试示例

本部分介绍如何测试上面配置的示例。

代码更改后,重新生成解决方案

  1. 在 Visual Studio 上,右键单击解决方案并选择“设置启动项目...”

    右键单击解决方案时显示的列表的屏幕截图,其中突出显示了“设置启动项目”选项。

  2. 在“属性”页上,对于除 TodoListSPA 以外的每个项目,请确保将“操作”设置为“启动”。

    “解决方案属性页”对话框的屏幕截图,其中显示已选中“多个启动项目”选项,并显示将项目的所有操作都设置为“启动”。

  3. 在 Visual Studio 顶部,单击绿色箭头。

    Visual Studio UI 的屏幕截图,其中调出了“启动”选项。

  4. 在本机应用的主屏幕上,单击“登录”。

    “待办事项列表客户端”对话框的屏幕截图。

    如果未看到本机应用屏幕,请从系统上保存项目存储库的文件夹搜索 *msalcache.bin 文件并将其移除。

  5. 你将会重定向到 AD FS 登录页面。 继续登录。

    “登录”页的屏幕截图。

  6. 登录后,在“创建待办事项”中输入“Web API 到 Web API 调用”文本。 单击“添加项”。 这会调用 Web API(待办事项列表服务),然后调用 Web API 2 (WebAPIOBO) 并在缓存中添加该项。

    “待办事项列表客户端”对话框的屏幕截图,其中在“待办事项”部分填充新的待办事项。

后续步骤

AD FS OpenID Connect/OAuth 流和应用程序方案