对使用 Microsoft Entra ID 访问 Azure 中继资源的托管标识进行身份验证

Azure 资源的托管标识是一项跨 Azure 功能,可便于用户创建与其中运行应用程序代码的部署关联的安全标识。 然后可以将该标识与访问控制角色进行关联,后者授予的自定义权限可用于访问应用程序需要的特定 Azure 资源。

借助托管标识,Azure 平台可管理此运行时标识。 对于标识本身或需要访问的资源,都不需要在应用程序代码或配置中存储和保护访问密钥。 如果服务总线客户端应用在 Azure 应用服务应用程序内或在虚拟机中运行,且启用了 Azure 资源的托管标识支持,则无需处理 SAS 规则和密钥或其他任何访问令牌。 客户端应用只需要中继命名空间的终结点地址。 当应用连接时,中继通过本文后面示例中展示的操作,将托管实体的上下文绑定到客户端。 与托管标识关联后,中继客户端便能执行所有授权操作。 授权是通过关联托管标识与中继角色进行授予。

注意

此功能已在所有区域正式发布,包括由世纪互联运营的 Azure。

概述

在某个安全主体(用户、组、应用程序)试图访问中继实体时,请求必须获得授权。 如果使用 Microsoft Entra ID,访问资源流程需要两步。

  1. 首先,验证安全主体的身份并返回 OAuth 2.0 令牌。 用于请求令牌的资源名称为 https://relay.chinacloudapi.cn。 如果某个应用程序在 Azure 实体(例如 Azure VM、虚拟机规模集或 Azure 函数应用)中运行,那么,它就可以使用托管标识来访问这些资源。
  2. 接下来,该令牌会作为请求的一部分传递到中继服务,以授权访问指定的资源(混合连接、WCF 中继)。 Microsoft Entra ID 通过 Azure 基于角色的访问控制 (Azure RBAC)授权访问受保护的资源。 Azure 中继定义了一组 Azure 内置角色,它们包含用于访问中继实体的通用权限集。 还可以定义自定义角色来访问这些数据。 有关 Azure 中继支持的内置角色的列表,请参阅适用于 Azure 中继的 Azure 内置角色。 向中继发出请求的本机应用程序和 Web 应用程序也可以通过 Microsoft Entra ID 进行授权。

适用于 Azure 中继的 Azure 内置角色

对于 Azure 中继,通过 Azure 门户和 Azure 资源管理 API 对命名空间和所有相关资源进行的管理已使用 Azure RBAC 模型进行了保护。 Azure 提供以下 Azure 内置角色,用于授权访问中继命名空间:

角色 说明
Azure 中继所有者 使用此角色授予对 Azure 中继资源的完全访问权限。
Azure 中继侦听器 使用此角色授予对 Azure 中继资源的侦听和实体读取访问权限。
Azure 中继发送方 使用此角色授予对 Azure 中继资源的发送和实体读取访问权限。

资源范围

向安全主体分配 Azure 角色之前,请确定安全主体应具有的访问权限的范围。 最佳做法规定,始终最好只授予最小的可能范围。

以下列表描述了可以限定 Azure 中继资源访问权限范围的级别,从最窄的范围开始:

  • 中继实体:角色分配应用于某个特定中继实体,例如混合连接或 WCF 中继。
  • 中继命名空间:角色分配应用于该命名空间下的所有中继实体。
  • 资源组:角色分配应用于该资源组下的所有中继资源。
  • 订阅:角色分配应用于该订阅中所有资源组内的所有中继资源。

注意

请记住,Azure 角色分配可能需要最多五分钟的时间进行传播。 有关如何定义内置角色的详细信息,请参阅了解角色定义。 若要了解如何创建 Azure 自定义角色,请参阅 Azure 自定义角色

启用托管标识

首先,启用需要访问 Azure 中继实体(混合连接或 WCF 中继)的 Azure 资源的托管标识。 例如,如果中继客户端应用程序在 Azure VM 上运行,请按照为 Azure VM 配置托管标识一文中的说明为 VM 启用托管标识。 启用此设置后,将在 Microsoft Entra ID 中创建新的托管服务标识。

如需支持托管标识的服务列表,请参阅支持 Azure 资源托管标识的服务

将 Azure 中继角色分配给托管标识

启用托管标识后,将 Azure 中继角色之一(Azure 中继所有者、Azure 中继侦听器或 Azure 中继发送方)分配给适当范围内的标识。 将 Azure 角色分配到某个托管标识后,将在适当的范围授予该托管标识访问中继实体的权限。

以下部分使用一个简单的应用程序,该应用程序在 Azure VM 实例上的托管标识下运行并访问中继资源。

VM 上访问中继实体的示例应用

  1. 从 GitHub 中将混合连接示例控制台应用程序下载到计算机。

  2. 创建一个 Azure VM。 对于本示例,请使用 Windows 10 映像。

  3. 为 Azure VM 启用系统分配的标识或用户分配的标识。 有关说明,请参阅为 VM 启用标识

  4. 将其中一个中继角色分配给所需范围内(中继实体、中继命名空间、资源组、订阅)的托管服务标识。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

  5. 按照 README 文档中的说明在本地计算机上以本地方式生成控制台应用。

  6. 将 <your local path>\RoleBasedAccessControl\bin\Debug 文件夹下的可执行文件复制到 VM。 可使用 RDP 连接到 Azure VM。 有关详细信息,请参阅如何连接并登录到运行 Windows 的 Azure 虚拟机

  7. 按照 README 文档中的说明在 Azure VM 上运行 RoleBasedAccessControl.exe。

    注意

    按照相同步骤运行 WCF 中继控制台应用程序

示例中突出显示的代码

下面是示例中的代码,演示如何使用 Microsoft Entra 身份验证连接到 Azure 中继服务。

  1. 使用 TokenProvider.CreateManagedIdentityTokenProvider 方法创建 TokenProvider 对象。

    • 若使用的是系统分配的托管标识,则使用以下方法:
      TokenProvider.CreateManagedIdentityTokenProvider();
      
    • 如果使用用户分配的托管标识,请从 Azure 门户中的“托管标识”页获取用户分配的标识的“客户端 ID”。 有关说明,请参阅用户分配的托管标识
      var managedCredential = new ManagedIdentityCredential(clientId);
      tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider(managedCredential);    
      
  2. 通过传递混合连接 URI 和上一步中创建的令牌提供程序来创建 HybridConnectionListenerHybridConnectionClient 对象。

    侦听器:

    var listener = new HybridConnectionListener(hybridConnectionUri, tokenProvider);    
    

    发送方

    var sender = new HybridConnectionClient(hybridConnectionUri, tokenProvider);    
    

示例

后续步骤

要了解有关 Azure 中继的详细信息,请参阅以下文章。