使用 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 应用
创建应用程序后,请执行以下步骤:
转到“设置”,然后选择“标识”。
选择“状态”,将其切换到“启用”。
选择“保存”,保存设置。
在信息消息中选择“是”。
启用此设置后,会在 Microsoft Entra ID 中创建一个新的服务标识并将其配置到 Azure 应用服务主机中。
现在,请将此服务标识分配给事件中心资源中所需范围中的某个角色。
使用 Azure 门户分配 Azure 角色
将其中一个事件中心角色分配给所需范围(事件中心命名空间、资源组、订阅)中的托管标识。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色。
注意
如需支持托管标识的服务列表,请参阅支持 Azure 资源托管标识的服务。
测试 Web 应用程序
- 创建事件中心命名空间和事件中心。
- 将 Web 应用部署到 Azure。 请参阅下面的选项卡式部分,获取 GitHub 上的示例 Web 应用程序的链接。
- 确保将 SendReceive.aspx 设置为 Web 应用的默认文档。
- 为 Web 应用启用标识。
- 将此标识分配给命名空间级别或事件中心级别的“事件中心数据所有者”角色。
- 运行 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 发送和接收消息。
示例
- .NET。
- 如需使用最新版 Azure.Messaging.EventHubs 包的示例,请参阅使用托管标识发布事件
- 如需使用旧版 Microsoft.Azure.EventHubs 包的示例,请参阅 GitHub 上的此 .NET 示例
- Java - 请参阅以下示例。
- GitHub 上的使用 Azure 标识发布事件示例。
- 若要了解如何使用 Apache Kafka 协议通过托管标识向事件中心发送事件和从事件中心接收事件,请参阅使用托管标识发送和接收消息的 Kafka 事件中心示例。
相关内容
- 请参阅下文,了解 Azure 资源的托管标识:什么是 Azure 资源的托管标识?
- 请参阅以下相关文章: