业务逻辑通常位于专用应用程序编程接口(API)中。 API 在本地或私有云中运行。 本机 Android、iOS、Mac 或 Windows 应用需要与 API 终结点进行交互才能使用数据或提供用户交互。 Microsoft Entra 应用程序代理和 Microsoft身份验证库(MSAL) 使本机应用能够安全地访问私有云 API。 Microsoft Entra 应用程序代理是一种更快、更安全的解决方案,而不是在应用层打开防火墙端口并控制身份验证和授权。
小窍门
术语“本地”是一个旧术语,可追溯到物理服务器位于公司办公室本地的时间。 现在,许多自承载工作负荷在数据中心的虚拟机上运行。 本地和私有云上的术语可互换使用。
本文逐步讲解如何设置用于托管本机应用可以访问的 Web API 服务的 Microsoft Entra 应用程序代理解决方案。
概述
下图显示了发布本地 API 的传统方法。 此方法需要打开传入端口 80 和 443。
下图显示了如何使用 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 多重身份验证。
先决条件
要完成本教程,你需要:
- 具有可创建和注册应用的帐户的 Azure 目录的管理员访问权限
- Microsoft身份验证库(MSAL)中的示例 Web API 和本机客户端应用
通过应用程序代理发布 API
若要通过应用程序代理在 Intranet 外部发布 API,请遵循与发布 Web 应用相同的模式。 有关详细信息,请参阅 教程:在 Microsoft Entra ID 中添加通过应用程序代理进行远程访问的本地应用程序。
若要通过应用程序代理发布 SecretAPI Web API,请执行以下作:
在本地计算机或 Intranet 上生成示例 SecretAPI 项目并将其发布为 ASP.NET Web 应用。 请确保可以在本地访问 Web 应用。
至少以应用程序管理员的身份登录到 Microsoft Entra 管理中心。
浏览到 Entra ID>企业应用。
在 “企业应用程序 - 所有应用程序 ”页的顶部,选择“ 新建应用程序”。
在 “浏览Microsoft Entra 库 ”页上,找到“ 本地应用程序 ”部分,然后选择“ 添加本地应用程序”。 随即显示“添加自己的本地应用程序”页。
如果没有安装专用网络连接器,系统会提示安装它。 选择 “下载专用网络连接器 ”以下载并安装连接器。
在 “添加自己的本地应用程序 ”页上添加信息。
在 “名称”旁边输入 SecretAPI。
在 内部 URL 旁边,输入用于从 Intranet 中访问 API 的 URL。
确保 预身份验证 设置为 Microsoft Entra ID。
选择“ 创建”,等待创建应用。
在 “企业应用程序 - 所有应用程序 ”页上,选择 SecretAPI 应用。
在 SecretAPI - 概述 页上,选择左侧导航中的 “属性 ”。
不希望 API 在 MyApps 面板中对最终用户可见,因此请在“属性”页底部将“对用户可见”设置为“否”,然后选择“保存”。
Web API 现在通过 Microsoft Entra 应用程序代理发布。 接下来,添加可以访问应用的用户。
在 SecretAPI - 概述 页上,选择左侧导航中的 “用户和组 ”。
在“ 用户和组 ”页上,选择“ 添加用户”。
在 “添加分配 ”页上,选择“ 用户和组”。
在 “用户和组 ”页上,搜索并选择可以访问应用的用户,包括至少自己。 选择所有用户后,选择 “选择”。
在 “添加分配 ”页上,选择“ 分配”。
注释
使用集成 Windows 身份验证的 API 可能需要 执行额外的步骤。
注册本机应用并授予对 API 的访问权限
本机应用是开发用于特定平台或设备上的程序。 在本机应用可以连接和访问 API 之前,必须在 Microsoft Entra ID 中注册它。 以下步骤演示如何注册本机应用,并授予它对通过应用程序代理发布的 Web API 的访问权限。
若要注册 AppProxyNativeAppSample 本机应用,请执行以下步骤:
至少以应用程序管理员的身份登录到 Microsoft Entra 管理中心。
浏览到 Entra ID>Enterprise 应用>应用注册。
选择“新注册”。
在 “注册应用程序 ”页上输入信息。
在 “名称”下输入 AppProxyNativeAppSample。
在支持的帐户类型下,选择仅在此组织目录中的帐户(仅Contoso 单租户)。
在 重定向 URL 下,展开下拉菜单并选择 公共客户端/本机(移动和桌面),然后输入 *https://login.partner.microsoftonline.cn/common/oauth2/nativeclient*。
选择 “注册”,然后等待应用成功注册。
应用 AppProxyNativeAppSample 现已在 Microsoft Entra ID 中注册。 为您的本机应用授予对SecretAPI Web API的访问权限:
在 “应用注册 ”页上,选择 AppProxyNativeAppSample 应用。
在 AppProxyNativeAppSample 页上,选择左侧导航中的 API 权限 。
在 “API 权限 ”页上,选择“ 添加权限”。
在第一个 请求 API 权限 页上,选择 组织使用的 API 选项卡,然后搜索并选择 SecretAPI。
在下一个 请求 API 权限 页上,选中 user_impersonation旁边的复选框,然后选择“ 添加权限”。
返回 API 权限 页,可以选择 Contoso 的“授予管理员许可 ”,以防止其他用户单独同意应用。
配置本机应用代码
最后一步是配置本机应用。 必须将代码添加到 NativeClient 示例应用的 Form1.cs 文件中。 该代码使用 MSAL 库 获取令牌。 令牌用于请求 API 调用,并将其附加到请求的标头中。 令牌作为持有者证书附加。 有关 MSAL 的详细信息,请参阅 向项目添加 MSAL 并 添加对 MSAL 的引用。
在 Form1.cs中,将命名空间
using Microsoft.Identity.Client;添加到代码中。在Microsoft身份验证库(MSAL)的身份验证上下文中编辑本机应用程序代码,以包含此 自定义代码示例。
配置本机应用以连接到 Microsoft Entra ID,并使用应用程序代理调用 API。 然后,用Microsoft Entra ID中的值更新NativeClient sample app的App.config文件中的占位符值。
将 目录(租户)ID 粘贴到
<add key="ida:Tenant" value="" />字段中。 可以从任一应用的 “概述 ”页找到并复制此值(GUID)。将 AppProxyNativeAppSample 应用程序(客户端)ID 粘贴到
<add key="ida:ClientId" value="" />字段中。 可以在“管理”下的左侧导航中找到并复制 AppProxyNativeAppSample 的“概述”页中的此值(GUID)。将 AppProxyNativeAppSample 重定向 URI 粘贴到
<add key="ida:RedirectUri" value="" />字段中。 可以在“管理”下的左侧导航中找到并复制 AppProxyNativeAppSample 的“身份验证”页中的此值(URI)。 此步骤是可选的,因为 MSAL 使用方法PublicClientApplicationBuilder.WithDefaultRedirectUri()插入建议的答复统一资源标识符(URI)。将 SecretAPI 应用程序 ID URI 粘贴到
<add key="todo:TodoListResourceId" value="" />字段中。 该值与todo:TodoListBaseAddress相同。 URI 值位于应用程序的 “公开 API ”页上SecretAPI。 在 “管理”下的左侧导航中查看。将 SecretAPI 主页 URL 粘贴到
<add key="todo:TodoListBaseAddress" value="" />字段中。 可以在“管理”下的左侧导航中找到和复制“SecretAPI 品牌和属性”页中的此值(URL)。
注释
如果解决方案未生成并报告错误 invalid Resx file,请在解决方案资源管理器中展开 “属性”,右键单击 Resources.resx,然后选择“ 查看代码”。 注释行 121 到 123。
配置参数后,生成并运行本机应用。 选择“ 登录 ”按钮时,应用允许你登录,然后显示成功屏幕以确认它已成功连接到 SecretAPI。