使用 Microsoft Entra ID 对托管标识进行身份验证以访问事件中心资源

Azure 事件中心支持使用 Azure 资源的托管标识进行 Microsoft Entra 身份验证。 Azure 资源的托管标识可以从 Azure 虚拟机 (VM)、函数应用、虚拟机规模集和其他服务中运行的应用程序使用 Microsoft Entra 凭据授权对事件中心资源的访问权限。 将 Azure 资源的托管标识与 Microsoft Entra 身份验证结合使用,可避免将凭据随在云中运行的应用程序一起存储。 本文介绍如何在 Azure VM 中使用托管标识授予对事件中心的访问权限。

在 VM 上启用托管标识

在使用 Azure 资源的托管标识访问 VM 中的事件中心资源之前,必须首先在 VM 上启用 Azure 资源的托管标识。 若要了解如何启用 Azure 资源托管标识,请参阅 在 Azure VM 上配置托管标识

向 Microsoft Entra 中的托管标识授予权限

若要通过应用程序中的托管标识授权对事件中心服务的请求,请先为该托管标识配置 Azure 基于角色的访问控制 (RBAC) 设置。 Azure 事件中心定义了 Azure 角色,这些角色包含向事件中心发送事件以及从事件中心接收事件的权限。 将 Azure 角色分配到某个托管标识后,将在适当的范围授予该托管标识访问事件中心数据的权限。 有关如何分配 Azure 角色的详细信息,请参阅使用 Microsoft Entra ID 进行身份验证,以便访问事件中心资源

示例应用程序

此部分的过程使用一个简单的应用程序,该应用程序在托管标识下运行并访问事件中心资源。

在这里,我们将使用一个在 Azure 应用服务中托管的示例 Web 应用程序。 有关如何创建 Web 应用程序的分步说明,请参阅在 Azure 中创建 ASP.NET Core Web 应用

创建应用程序后,请执行以下步骤:

  1. 转到“设置”,然后选择“标识”。

  2. 选择“状态”,将其切换到“启用”。

  3. 选择“保存”,保存设置。

    “标识”页的屏幕截图,其中显示系统分配的标识的状态设置为“开”。

  4. 在信息消息中选择“是”。

    启用此设置后,会在 Microsoft Entra ID 中创建一个新的服务标识并将其配置到 Azure 应用服务主机中。

    现在,请将此服务标识分配给事件中心资源中所需范围中的某个角色。

使用 Azure 门户分配 Azure 角色

将其中一个事件中心角色分配给所需范围(事件中心命名空间、资源组、订阅)中的托管标识。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

如需支持托管标识的服务列表,请参阅支持 Azure 资源托管标识的服务

测试 Web 应用程序

  1. 创建事件中心命名空间和事件中心。
  2. 将 Web 应用部署到 Azure。 请参阅下面的选项卡式部分,获取 GitHub 上的示例 Web 应用程序的链接。
  3. 确保将 SendReceive.aspx 设置为 Web 应用的默认文档。
  4. 为 Web 应用启用标识
  5. 将此标识分配给命名空间级别或事件中心级别的“事件中心数据所有者”角色。
  6. 运行 Web 应用程序,输入命名空间名称和事件中心名称,输入一条消息,然后选择“发送”。 若要接收事件,请选择“接收”。

可以在 GitHub 存储库中找到用于通过事件中心资源发送和接收数据的示例 Web 应用程序。

安装 NuGet 中的最新包,开始使用 EventHubProducerClient 向事件中心发送事件,使用 EventHubConsumerClient 接收事件。

注意

有关使用托管标识将事件发布到事件中心的 Java 示例,请参阅在 GitHub 上使用 Azure 标识示例发布事件

protected async void btnSend_Click(object sender, EventArgs e)
{
    await using (EventHubProducerClient producerClient = new EventHubProducerClient(txtNamespace.Text, txtEventHub.Text, new DefaultAzureCredential()))
    {
        // create a batch
        using (EventDataBatch eventBatch = await producerClient.CreateBatchAsync())
        {

            // add events to the batch. only one in this case. 
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes(txtData.Text)));

            // send the batch to the event hub
            await producerClient.SendAsync(eventBatch);
        }

        txtOutput.Text = $"{DateTime.Now} - SENT{Environment.NewLine}{txtOutput.Text}";
    }
}
protected async void btnReceive_Click(object sender, EventArgs e)
{
    await using (var consumerClient = new EventHubConsumerClient(EventHubConsumerClient.DefaultConsumerGroupName, $"{txtNamespace.Text}.servicebus.chinacloudapi.cn", txtEventHub.Text, new DefaultAzureCredential()))
    {
        int eventsRead = 0;
        try
        {
            using CancellationTokenSource cancellationSource = new CancellationTokenSource();
            cancellationSource.CancelAfter(TimeSpan.FromSeconds(5));

            await foreach (PartitionEvent partitionEvent in consumerClient.ReadEventsAsync(cancellationSource.Token))
            {
                txtOutput.Text = $"Event Read: { Encoding.UTF8.GetString(partitionEvent.Data.Body.ToArray()) }{ Environment.NewLine}" + txtOutput.Text;
                eventsRead++;
            }
        }
        catch (TaskCanceledException ex)
        {
            txtOutput.Text = $"Number of events read: {eventsRead}{ Environment.NewLine}" + txtOutput.Text;
        }
    }
}

用于 Kafka 的事件中心

可以使用 Apache Kafka 应用程序通过托管标识 OAuth 向 Azure 事件中心发送消息,以及从 Azure 事件中心接收消息。 窗口 GitHub 上的以下示例:用于 Kafka 的事件中心 - 使用托管标识 OAuth 发送和接收消息

示例