Partager via

如何将托管标识与 Azure 服务总线配合使用

Azure 资源托管标识在 Microsoft Entra ID 中为 Azure 服务提供了一个自动托管标识。 可以使用此标识向 Azure 服务总线进行身份验证,而无需在代码中存储凭据。

本文逐步讲解如何启用托管标识、分配适当的服务总线角色,以及从应用程序代码连接到服务总线。

注意

如果不熟悉托管标识,请参阅 Azure 资源的托管标识

先决条件

若要将托管标识与 Azure 服务总线配合使用,需要:

重要

可以为服务总线命名空间禁用本地或 SAS 密钥身份验证,仅允许 Microsoft Entra 身份验证。 有关分步说明,请参阅禁用本地身份验证

将服务总线角色分配给托管标识

Microsoft Entra 通过 Azure 基于角色的访问控制 (RBAC) 授予对受保护资源的访问权限。 Azure 服务总线提供 Azure 内置角色,其中包含用于访问服务总线实体的常见权限集。 还可以定义自定义角色。

下表列出了用于授权访问服务总线命名空间的 Azure 内置角色:

角色 说明
Azure 服务总线数据所有者 完全访问服务总线命名空间及其实体(队列、主题、订阅和筛选器)
Azure 服务总线数据发送方 将消息发送到服务巴士队列和主题
Azure 服务总线数据接收器 从 Service Bus 队列和订阅接收消息

在 Azure 门户中分配角色

若要在 Azure 门户中将角色分配给一个托管标识,请执行以下操作:

  1. 转到您的服务总线命名空间、队列或主题。
  2. 从左侧菜单中选择“访问控制 (IAM)”
  3. 选择添加>添加角色分配
  4. 在“ 角色 ”选项卡上,选择相应的服务总线数据角色。
  5. 成员选项卡上,选择托管身份,然后选择选择成员
  6. 选择您 Azure 资源的托管标识。
  7. 选择审核 + 分配

有关详细信息,请参阅使用 Azure 门户分配 Azure 角色

选择资源范围

在分配 Azure 角色之前,请确定托管标识所需的访问权限范围。 仅授予尽可能窄的权限范围。

以下列表描述了可将服务总线资源访问权限限定到哪些级别,从最小的范围开始:

  • 队列主题订阅:角色分配适用于特定的服务总线实体。

  • 服务总线命名空间:角色分配跨越命名空间下服务总线的整个拓扑。

  • 资源组:角色分配适用于资源组下的所有服务总线资源。

  • 订阅:角色分配适用于订阅的所有资源组中的所有服务总线资源。

    注意

    Azure 角色分配可能需要最多五分钟的时间才能传播。

使用 Azure CLI 分配角色

Azure 门户不支持在主题订阅级别将托管标识分配到服务总线角色。 使用 Azure CLI az role assignment create 命令在任何范围内分配角色:

az role assignment create \
    --role $service_bus_role \
    --assignee $assignee_id \
    --scope /subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.ServiceBus/namespaces/$service_bus_namespace/topics/$service_bus_topic/subscriptions/$service_bus_subscription

有关如何定义内置角色的详细信息,请参阅了解角色定义。 若要了解如何创建 Azure 自定义角色,请参阅 Azure 自定义角色

注意

如果在从服务总线 RBAC 角色中删除其托管标识后源服务或应用未重启,则源应用可能会继续向服务总线实体发送或接收消息,直到令牌过期(默认令牌有效期为 24 小时)。 此行为是设计造成的。

从 RBAC 角色中删除源的托管标识后,重启源应用或服务以立即使令牌过期,并阻止它从服务总线实体发送和接收消息。

在 Azure SDK 中使用托管标识连接到服务总线

用于 .NET、Java、JavaScript 和 Python 的 Azure SDK 支持使用服务总线进行托管标识身份验证。 以下示例演示如何使用 .NET SDK 进行连接。

在 .NET 中,ServiceBusClient 对象通过使用采用完全限定命名空间和 TokenCredential 的构造函数进行初始化。 DefaultAzureCredential 派生自 TokenCredential,因而会自动使用为应用配置的托管标识。 从托管标识上下文到服务总线的流以及授权握手都是由令牌凭据自动处理。 这是比使用 SAS 更简单的模型。

var client = new ServiceBusClient("contoso.servicebus.chinacloudapi.cn", new DefaultAzureCredential());

可以像往常一样使用 ServiceBusSenderServiceBusReceiverServiceBusProcessor 发送和接收消息。

有关使用托管标识发送和接收消息的分步说明,请参阅以下快速入门。 这些快速入门包含使用服务主体发送和接收消息的代码,但该代码与使用托管标识时的代码相同。

注意

托管标识仅在 Azure 环境中工作,适用于 App Service、Azure VM 和规模集。 对于 .NET 应用程序,服务总线 NuGet 包使用的 Microsoft.Azure.Services.AppAuthentication 库提供对此协议的抽象,并支持本地开发体验。 此库还允许你在开发计算机上使用 Visual Studio、Azure CLI 或 Microsoft Entra 集成身份验证中的用户帐户在本地测试代码。 有关此库的本地开发选项的详细信息,请参阅使用 .NET 向 Azure Key Vault 进行服务到服务身份验证

后续步骤