使用托管标识访问Azure 服务总线资源

Azure资源的托管标识使应用程序无需在代码中存储凭据即可对Azure 服务总线进行身份验证。 Azure会自动为你处理标识及其凭据。

在代码中存储凭据会产生安全风险和维护开销。 托管标识通过 Microsoft Entra ID 提供自动凭据管理,从而消除了这些顾虑。

本文介绍如何为服务总线配置托管标识身份验证,以便应用程序无需硬编码凭据即可安全地发送和接收消息。

先决条件

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

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

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

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

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

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

了解如何确定 服务总线 RBAC 的范围级别

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

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

  • 队列、主题或主题订阅:角色分配仅适用于该特定消息传送实体。
  • 服务总线命名空间:角色分配跨越命名空间下服务总线的整个拓扑。
  • 资源组:角色分配适用于资源组下的所有服务总线资源。
  • Azure 订阅:角色分配适用于Azure订阅中所有资源组中的所有服务总线资源。

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

在 Azure 门户中将托管标识分配角色

  1. 转到您的服务总线命名空间、队列或主题。

  2. 在左侧菜单中,选择“访问控制 (IAM)”。

  3. 选择添加>添加角色分配

  4. 在“ 角色 ”选项卡上,选择相应的服务总线数据角色。

  5. “成员”选项卡上,选择“托管身份”>选择成员

  6. 选择您 Azure 资源的托管标识。

  7. 选择审核 + 分配

有关详细信息,请参阅使用 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 自定义角色,请参阅 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 环境中运行,包括 Azure 应用服务、Azure 虚拟机和规模集。 对于.NET应用程序,Microsoft.Azure.Services.AppAuthentication库(服务总线 NuGet 包使用)提供对此协议的抽象并支持本地开发。 本地可以使用您的用户帐户,从 Visual Studio、Azure CLI,或 Microsoft Entra 集成身份验证中测试代码。 有关详细信息,请参阅 app Authentication 客户端库 for .NET