使用 Microsoft Entra 应用程序代理提供对私有云或本地托管的应用程序编程接口 (API) 的安全访问

业务逻辑通常位于专用应用程序编程接口 (API) 中。 该 API 在本地或私有云中运行。 本机 Android、iOS、Mac 或 Windows 应用需要与 API 终结点交互才能使用数据或提供用户交互功能。 通过使用 Microsoft Entra 应用程序代理和 Microsoft 身份验证库 (MSAL),本机应用可安全访问私有云 API。 与开启防火墙端口和控制应用层身份验证和授权相比,Microsoft Entra 应用程序代理是一种更快速、更安全的解决方案。

提示

“本地”是一个旧术语,可追溯到物理服务器位于公司办公室本地的时间。 现在,许多自承载工作负载在数据中心内的虚拟机上运行。 “本地”和“私有云”这两个术语可互换使用。

本文逐步讲解如何设置 Microsoft Entra 应用程序代理解决方案,以托管本机应用可以访问的 Web API 服务。

概述

下图显示了发布本地 API 的传统方法。 此方法需要开启传入端口 80 和 443。

传统 API 访问

下图显示如何使用 Microsoft Entra 应用程序代理安全发布 API,而无需开启任何传入端口:

Microsoft Entra 应用程序代理 API 访问

Microsoft Entra 应用程序代理是此解决方案的主干,可用作 API 访问的公共终结点,并提供身份验证和授权。 你可以使用 Microsoft 身份验证库 (MSAL) 中的多个库,从大量平台访问 API。

由于 Microsoft Entra 应用程序代理身份验证和授权建立在 Microsoft Entra ID 之上,因此可以使用 Microsoft Entra 条件访问,确保只有受信任的设备才可访问通过应用程序代理发布的 API。 对于桌面设备,可使用 Microsoft Entra 联接或 Microsoft Entra 混合联接设备,而对于设备,可使用 Intune 托管设备。 还可以利用 Microsoft Entra ID P1 或 P2 功能,例如 Microsoft Entra 多重身份验证,以及由机器学习提供支持的 Microsoft Entra ID 保护安全功能。

先决条件

若要完成本演练,你需要:

  • Azure 目录的管理员访问权限,以及可用于创建和注册应用的帐户
  • 来自 Microsoft 身份验证库 (MSAL) 的示例 Web API 和原生客户端应用

通过应用程序代理发布 API

若要通过应用程序代理在 Intranet 外部发布 API,请遵循与发布 Web 应用相同的模式。 有关详细信息,请参阅教程:添加本地应用程序以通过 Microsoft Entra ID 应用程序代理进行远程访问

通过应用程序代理发布 SecretAPI Web API:

  1. 生成示例 SecretAPI 项目并将其发布为本地计算机或 Intranet 上的 ASP.NET Web 应用。 请确保可以在本地访问 Web 应用。

  2. 至少以应用程序管理员的身份登录到 Microsoft Entra 管理中心

  3. 浏览到“标识”>“应用程序”>“企业应用程序”。

  4. 在“企业应用程序 - 所有应用程序”页的顶部,选择“新建应用程序”。

  5. 在“浏览 Microsoft Entra 库”页上,找到“本地应用程序”部分,然后选择“添加本地应用程序”。 随即显示“添加自己的本地应用程序”页。

  6. 如果尚未安装专用网络连接器,系统会提示你安装它。 选择“下载专用网络连接器”以下载并安装连接器。

  7. 在“添加自己的本地应用程序”页面上添加信息。

    1. 在“名称”旁边,输入“SecretAPI”。

    2. 在“内部 URL”旁边,输入用于从 Intranet 中访问 API 的 URL。

    3. 确保将“预身份验证”设置为“Microsoft Entra ID”。

    4. 选择“创建”,等待创建完应用。

    添加 API 应用

  8. 在“企业应用程序 - 所有应用程序”页上,选择“SecretAPI”应用。

  9. 在“SecretAPI - 概述”页上,选择左侧导航栏中的“属性”。

  10. 如果不希望在“MyApps”面板中向最终用户提供 API,则在“属性”页底部将“对用户可见”设置为“否”,然后选择“保存”。

    对用户不可见

Web API 现在通过 Microsoft Entra 应用程序代理发布。 接下来,添加可访问该应用的用户。

  1. 在“SecretAPI - 概述”页上,选择左侧导航栏中的“用户和组”。

  2. 在“用户和组”页上,选择“添加用户”。

  3. 在“添加分配”页上,选择“用户和组”。

  4. 在“用户和组”页上,搜索并选择可以访问应用的用户,至少应包括你自己。 选择所有用户后,选择“选择”。

    选择并分配用户

  5. 回到“添加分配”页上,选择“分配”。

注意

对于使用集成 Windows 身份验证的 API,可能还需要执行其他步骤

注册本机应用并授予对 API 的访问权限

本机应用是为在特定平台或设备上使用而开发的程序。 在本机应用可以连接和访问 API 之前,必须在 Microsoft Entra ID 中进行注册。 以下步骤演示如何注册本机应用,以及如何向它授予访问通过应用程序代理发布的 Web API 的权限。

注册 AppProxyNativeAppSample 本机应用:

  1. 至少以应用程序管理员的身份登录到 Microsoft Entra 管理中心

  2. 浏览到“标识”>“应用程序”>“企业应用程序”>“应用注册”。

  3. 选择“新注册”。

  4. 在“注册应用程序”页面上输入信息。

    1. 在“名称”下,输入 AppProxyNativeAppSample。

    2. 在“支持的帐户类型”下,选择“仅此组织目录中的帐户(仅 Contoso - 单一租户)”。

    3. 在“重定向 URL”下,使用下拉列表选择“公共客户端/本机(移动和桌面)”,然后输入 *https://login.microsoftonline.com/common/oauth2/nativeclient *。

    4. 选择“注册”,并等待应用成功注册。

      新应用程序注册

AppProxyNativeAppSample 应用现在 Microsoft Entra ID 中注册。 为本机应用提供访问 SecretAPI Web API 的权限:

  1. 在“应用注册”页上,选择“AppProxyNativeAppSample”应用。

  2. 在“AppProxyNativeAppSample”页上,选择左侧导航栏中的“API 权限”。

  3. 在“API 权限”页上,选择“添加权限”。

  4. 在第一个“请求获取 API 权限”页上,选择“我的组织使用的 API”选项卡,然后搜索并选择“SecretAPI”。

  5. 在下一个“请求获取 API 权限”页上,选中“user_impersonation”旁边的复选框,然后选择“添加权限”。

    选择一个 API。

  6. 返回“API 权限”页,你可以选择“为 Contoso 授予管理员许可”,以防止其他用户必须单独同意该应用。

配置本机应用代码

最后一步是配置本机应用。 代码必须添加到 NativeClient 示例应用中的 Form1.cs 文件中。 该代码使用 MSAL 库来获取令牌。 令牌请求 API 调用,并将其附加到请求中的标头。 令牌作为持有者证书附加。 有关 MSAL 的详细信息,请参阅将 MSAL 添加到项目添加对 MSAL 的引用

  1. 在 Form1.cs 中,将命名空间 using Microsoft.Identity.Client; 添加到代码。

  2. 在 Microsoft 身份验证库 (MSAL) 的身份验证上下文中编辑原生应用程序代码,以包含此自定义代码示例

配置本机应用以连接到 Microsoft Entra ID,并使用应用程序代理调用 API。 然后,使用 Microsoft Entra ID 中的值更新 NativeClient sample appApp.config 文件中的占位符值。

  1. 将“目录(租户) ID”粘贴到 <add key="ida:Tenant" value="" /> 字段中。 你可以从任一应用的“概述”页中找到并复制此值 (GUID)。

  2. 将 AppProxyNativeAppSample“应用程序(客户端) ID”粘贴到 <add key="ida:ClientId" value="" /> 字段中。 可以从 AppProxyNativeAppSample 的“概述”页(位于“管理”下的左侧导航)查找并复制此值(一个唯一标识符)。

  3. 将 AppProxyNativeAppSample“重定向 URI”粘贴到 <add key="ida:RedirectUri" value="" /> 字段中。 可以从 AppProxyNativeAppSample 的“授权”页(位于“管理”下的左侧导航)查找并复制此值(一个统一资源标识符)。 此步骤是可选的,因为 MSAL 使用 PublicClientApplicationBuilder.WithDefaultRedirectUri() 方法插入建议的答复统一资源标识符 (URI)。

  4. 将 SecretAPI“应用程序 ID URI”粘贴到 <add key="todo:TodoListResourceId" value="" /> 字段中。 该值与 todo:TodoListBaseAddress 相同。 可在 SecretAPI 应用程序的“公开 API”页中找到 URI 值。 查看“管理”下的左侧导航栏。

  5. 将 SecretAPI“主页 URL”粘贴到 <add key="todo:TodoListBaseAddress" value="" /> 字段中。 可以从 SecretAPI 的“品牌和属性”(位于左侧导航中的“管理”下)查找并复制此值(一个 URL)。

注意

如果解决方案未生成并报告错误“Resx 文件无效”,请在解决方案资源管理器中,展开“属性”,右键单击“Resources.resx”,然后选择“查看代码”。 为第 121 行到第 123 行添加注释。

配置参数后,生成并运行本机应用。 选择“登录”按钮时,应用程序会让你登录,然后显示成功屏幕,以确认它已成功连接到 SecretAPI。

显示“已成功连接 Secret A P I”消息和“确定”按钮的屏幕截图。

后续步骤