Azure资源的托管标识使应用程序无需在代码中存储凭据即可对Azure 服务总线进行身份验证。 Azure会自动为你处理标识及其凭据。
在代码中存储凭据会产生安全风险和维护开销。 托管标识通过 Microsoft Entra ID 提供自动凭据管理,从而消除了这些顾虑。
本文介绍如何为服务总线配置托管标识身份验证,以便应用程序无需硬编码凭据即可安全地发送和接收消息。
先决条件
若要将托管标识与 Azure 服务总线配合使用,需要:
一份 Azure 订阅。 如果您还没有,请在开始之前创建一个试用订阅。
Azure 服务总线命名空间。 若要创建一个,请参阅 创建服务总线命名空间。
在您的 Azure 计算资源上,启用了托管标识。 See:
可以为服务总线命名空间禁用本地或共享访问签名(SAS)密钥身份验证,并仅允许Microsoft Entra 身份验证。 有关分步说明,请参阅禁用本地身份验证。
将服务总线角色分配给托管标识
Microsoft Entra 通过 Azure 基于角色的访问控制 (RBAC) 授予对受保护资源的访问权限。 Azure 服务总线提供 Azure 内置角色,其中包含用于访问服务总线实体的常见权限集。 还可以定义自定义角色。
下表列出了用于授权访问服务总线命名空间的 Azure 内置角色:
| 角色 | 说明 |
|---|---|
| Azure 服务总线数据所有者 | 完全访问服务总线命名空间及其实体(队列、主题、订阅和筛选器) |
| Azure 服务总线数据发送方 | 能够将消息发送到服务总线队列和主题 |
| Azure 服务总线数据接收器 | 能够从服务总线队列和订阅接收消息 |
了解如何确定 服务总线 RBAC 的范围级别
在分配 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 集成身份验证中测试代码。 有关详细信息,请参阅 app Authentication 客户端库 for .NET。