方案:调用 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)
在”AD FS管理”中,右键单击“应用程序组”,然后选择“添加应用程序组” 。
在应用程序组向导中,对于“名称”,输入“ebApiToWebApi”,并在“客户端-服务器应用程序”下选择”访问 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://[AD FS 主机名]/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://[AD FS 主机名]/federationmetadata/2007-06/federationmetadata.xml
ida:OBOWebAPIBase - 在上面的“AD FS 中的应用注册”部分输入来自 #19 的标识符值。
ida:Authority - 输入 https://[AD FS 主机名]/adfs
在 WebAPIOBO 下打开 Web.config 文件。 修改以下内容:
ida: AdfsMetadataEndpoint - 输入 https://[AD FS 主机名]/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(待办事项列表服务),然后调用 Web API 2 (WebAPIOBO) 并在缓存中添加该项。