用于 Azure 事件中心的托管标识身份验证

托管身份是 Microsoft Entra ID 中由 Azure 代为管理的身份,因此应用程序可以对支持 Microsoft Entra 认证的服务进行认证,而无需存储任何凭据。 Azure 事件中心 支持 Microsoft Entra 认证,并支持管理身份,用于 Azure 资源,使运行在 Azure 中的应用程序无需在代码或配置中嵌入连接字符串或访问密钥即可连接到 Event Hubs。

当你将托管标识与 Microsoft Entra 身份验证结合使用时,在 Azure 虚拟机、Azure Functions、Azure 应用服务 和虚拟机规模集等服务中运行的应用程序可以使用 Azure 自动预配并轮换的凭据来访问事件中心数据。 这种方法消除了密钥泄露的风险,并降低了凭证管理的运营开销。

管理的身份认证的运作方式

通过托管身份访问事件中心资源是一个两步过程:

  • 认证:托管身份向 Microsoft Entra ID 请求 OAuth 2.0 令牌。 Azure 会根据代码运行的计算环境自动提供身份,因此应用程序中不会存储或传递任何秘密。
  • 授权:令牌会提交给事件中心服务,后者根据分配给该标识的 Azure 基于角色的访问控制 (RBAC) 角色授予访问权限。

有关认证和授权流程的完整描述,请参见“授权使用 Microsoft Entra ID 访问 Azure 事件中心 资源”。

托管标识类型

Event Hubs 支持这两种类型的托管标识:

  • 系统分配的托管身份:直接在Azure资源上启用,如虚拟机或应用服务应用。 它的生命周期与该资源绑定,只有该资源能使用它来请求令牌。
  • 用户分配的管理身份:作为独立的 Azure 资源创建,分配给一个或多个 Azure 资源,以便多个工作负载共享同一身份。

想了解更多关于这两种类型以及何时选择每种类型,请参见 “托管身份类型”。 关于支持托管身份的服务列表,请参见支持Azure资源托管身份的服务

Azure 事件中心的内置角色

启用托管身份后,给它分配一个 Azure 内置角色,定义其对事件中心数据的权限。 Azure 提供了以下内置角色,用于授权使用 Microsoft Entra ID 访问 Event Hubs 数据:

角色 Description
Azure 事件中心 数据所有者 授予对活动中心资源的完全访问权限。
Azure 事件中心数据发送方 授权将事件发送到Event Hub资源。
Azure 事件中心 数据接收器 授予从 Event Hubs 资源接收事件的权限。

你可以在消费者组、事件中心、命名空间、资源组或订阅层面分配角色。 授予在满足应用程序需求前提下的最小权限范围。 有关完整的范围和角色详细信息,请参见 Azure built-in roles for Azure 事件中心。 要在 Azure 门户中分配角色,请参见“使用 Azure 门户分配 Azure 角色

代币到期行为

当你从 Event Hubs RBAC 角色中移除托管身份时,该更改不会立即生效于正在运行的应用程序。 如果源服务或应用没有重启,它可以继续向事件中心发送或接收事件,直到令牌到期。 默认的代币有效期为24小时。 此行为是设计造成的。

要在移除角色身份后立即撤销访问权限,请重启源应用或服务,使现有令牌过期。

客户端SDK支持

Azure SDK 客户端库会通过 DefaultAzureCredential 为你获取托管标识令牌,它会自动检测托管环境中可用的托管标识。 你可以将凭证传递给 EventHubConsumerClient 以发送事件,并传递给 EventHubProducerClient 以接收事件,而无需提供连接字符串或密钥。

var credential = new DefaultAzureCredential();

// Send events with a managed identity.
var producerClient = new EventHubProducerClient(
    "<namespace>.servicebus.chinacloudapi.cn",
    "<event-hub-name>",
    credential);

// Receive events with a managed identity.
var consumerClient = new EventHubConsumerClient(
    EventHubConsumerClient.DefaultConsumerGroupName,
    "<namespace>.servicebus.chinacloudapi.cn",
    "<event-hub-name>",
    credential);

若要使用这些客户端,请从 NuGet 安装最新的 Azure.Messaging.EventHubs 包。 有关可运行的示例,请参见:

Apache Kafka 事件中心

Apache Kafka 应用可以通过使用 OAuth 的管理身份向 Azure 事件中心 发送事件并接收事件。 关于 Java 示例,请参见 Kafka 事件中心:使用管理身份 OAuth 发送和接收消息