Azure 资源托管标识在 Microsoft Entra ID 中为 Azure 服务提供了一个自动托管标识。 可以使用此标识向 Azure 服务总线进行身份验证,而无需在代码中存储凭据。
本文逐步讲解如何启用托管标识、分配适当的服务总线角色,以及从应用程序代码连接到服务总线。
如果不熟悉托管标识,请参阅 Azure 资源的托管标识。
先决条件
若要将托管标识与 Azure 服务总线配合使用,需要:
一份 Azure 订阅。 如果您还没有,请在开始之前创建一个试用订阅。
Azure 服务总线命名空间。 若要创建一个,请参阅 创建服务总线命名空间。
在您的 Azure 计算资源上,启用了托管标识。 See:
可以为服务总线命名空间禁用本地或共享访问签名(SAS)密钥身份验证,并仅允许Microsoft Entra 身份验证。 有关分步说明,请参阅禁用本地身份验证。
将服务总线角色分配给托管标识
Microsoft Entra 通过 Azure 基于角色的访问控制 (RBAC) 授予对受保护资源的访问权限。 Azure 服务总线提供 Azure 内置角色,其中包含用于访问服务总线实体的常见权限集。 还可以定义自定义角色。
下表列出了用于授权访问服务总线命名空间的 Azure 内置角色:
| 角色 | 说明 |
|---|---|
| Azure 服务总线数据所有者 | 完全访问服务总线命名空间及其实体(队列、主题、订阅和筛选器) |
| Azure 服务总线数据发送方 | 能够将消息发送到服务总线队列和主题 |
| Azure 服务总线数据接收器 | 能够从服务总线队列和订阅接收消息 |
选择资源范围
在分配 Azure 角色之前,请确定托管标识所需的访问权限范围。 仅授予尽可能窄的权限范围。
以下列表描述了可将服务总线资源访问权限限定到哪些级别,从最小的范围开始:
- 队列、主题或订阅:角色分配适用于特定的 服务总线 实体。
- 服务总线命名空间:角色分配跨越命名空间下服务总线的整个拓扑。
- 资源组:角色分配适用于资源组下的所有服务总线资源。
- 订阅:角色分配适用于订阅的所有资源组中的所有服务总线资源。
Azure 角色分配可能需要最多五分钟的时间才能传播。
在 Azure 门户中将托管标识分配角色
转到您的服务总线命名空间、队列或主题。
在左侧菜单中,选择“访问控制 (IAM)”。
选择添加>添加角色分配。
在“ 角色 ”选项卡上,选择相应的服务总线数据角色。
在“成员”选项卡上,选择“托管身份”>选择成员。
选择您 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 自定义角色,请参阅 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());
使用 ServiceBusSender 和 ServiceBusReceiver 或 ServiceBusProcessor 像往常一样发送和接收消息。
有关使用托管标识发送和接收消息的分步说明,请参阅以下快速入门。 这些快速入门包含使用服务主体发送和接收消息的代码,但该代码与使用托管标识时的代码相同。
注意
托管标识只在 Azure 环境中运行,包括 Azure 应用服务、Azure 虚拟机和规模集。 对于 .NET 应用程序, Microsoft.Azure.Services.AppAuthentication 该库提供对此协议的抽象,并支持本地开发体验。 服务总线 NuGet 包使用此库。
还可以使用此库通过 Visual Studio、Azure CLI 或 Microsoft Entra 集成身份验证中的用户帐户在本地测试开发计算机上的代码。 有关此库的本地开发选项的详细信息,请参阅 适用于 .NET 的应用身份验证客户端库 - 版本 1.6.0。