使用 Microsoft Entra ID 驗證受控識別以存取事件中樞資源

Azure 事件中樞支援以 Microsoft Entra 驗證 Azure 資源的受控識別。 Azure 資源的受控識別可以從執行於 Azure 虛擬機器 (VM)、函式應用程式和虛擬機器擴展集及其他服務中的應用程式中,Microsoft Entra AD 認證來授與事件中樞資源的存取權。 藉由使用適用於 Azure 資源的受控識別搭配 Microsoft Entra 驗證,您可以避免使用在雲端執行的應用程式儲存認證。 本文說明如何從 Azure VM 使用受控識別來授權存取事件中樞。

在 VM 上啟用受控識別

您必須先在 VM 上啟用 Azure 資源的受控識別,才能從 VM 使用 Azure 資源的受控識別來存取事件中樞資源。 若要了解如何啟用 Azure 資源的受控識別,請參閱下列其中一篇文章:

在 Microsoft Entra ID 中將權限授與受控識別

若要授權從應用程式中的受控識別對事件中樞服務的要求,請先為該受控識別完成 Azure 角色型存取控制 (Azure RBAC) 設定。 Azure 事件中樞可定義 Azure 角色,其中包含從事件中樞傳送和讀取的權限。 將 Azure 角色指派給受控識別時,受控識別即獲授與在適當範圍存取事件中樞資料的權限。 如需有關指派 Azure 角色的詳細資訊,請參閱使用 Microsoft Entra ID 驗證以存取事件中樞資源

搭配使用事件中樞與受控識別

若要以受控識別來使用事件中樞,請將適當範圍的事件中樞 RBAC 角色指派給身分識別。 本節中的程序以一個簡單的應用程式為例,該應用程式以受控識別執行,並存取事件中樞資源。

我們使用一個託管於 Azure App Service 的範例 Web 應用程式。 如需有關建立 Web 應用程式的逐步指示,請參閱在 Azure 中建立 ASP.NET Core Web 應用程式

建立應用程式之後,請遵循下列步驟:

  1. 移至 [設定] 並選取 [身分識別]

  2. 將 [狀態] 設定為 [開啟]

  3. 選取 [儲存] 以儲存設定。

    Screenshot of the Identity page showing the status of system-assigned identity set to ON.

  4. 在確認訊息上選取 [是]

    一旦啟用此設定,Microsoft Entra ID 中會建立新的服務識別,並設定給 App Service 主機。

    現在,在所需範圍內,將此服務識別指派給事件中樞資源中的角色。

使用 Azure 入口網站指派 Azure 角色

在所需範圍內 (事件中樞命名空間、資源群組、訂用帳戶),將其中一個事件中樞角色指派給受控識別。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

注意

關於支援受控識別的服務清單,請參閱支援以受控識別存取 Azure 資源的服務

測試 Web 應用程式

  1. 建立事件中樞命名空間和事件中樞。
  2. 將 Web 應用程式部署至 Azure。 如需了解 GitHub 上範例 Web 應用程式的連結,請參閱下列索引標籤式段落。
  3. 確保 SendReceive.aspx 設定為 Web 應用程式的預設文件。
  4. 啟用 Web 應用程式的身分識別
  5. 在命名空間層級或事件中樞層級上,將此身分識別指派給事件中樞資料擁有者角色。
  6. 執行 Web 應用程式,輸入命名空間名稱和事件中樞名稱、訊息,然後選取 [傳送]。 若要接收事件,請選取 [接收]

您現在可以啟動 Web 應用程式,並將瀏覽器指向範例 aspx 頁面。 在 GitHub 存放庫中,您可以找到往返事件中樞資源收送資料的範例 Web 應用程式。

NuGet 安裝最新套件,並開始使用 EventHubConsumerClient 將事件傳送至事件中樞,以及使用 EventHubProducerClient 來接收事件。

注意

有關使用受控識別將事件發佈至事件中樞的 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.windows.net", 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 事件中樞收送訊息。 請參閱 GitHub 上提供的下列範例:Kafka 的事件中樞 - 使用受控識別 OAuth 來傳送和接收訊息

範例

.

下一步