分享方式:


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

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

在 VM 上啟用受控識別

您必須先在 VM 上啟用 Azure 資源的受控識別,才能從 VM 使用 Azure 資源的受控識別來存取事件中樞資源。 若要了解如何啟用 Azure 資源受控識別,請參閱設定 Azure VM 的受控識別

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

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

範例應用程式

本節中的程序以一個簡單的應用程式為例,該應用程式以受控識別執行,並存取事件中樞資源。

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

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

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

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

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

    [身分識別] 頁面的螢幕擷取畫面,其中顯示系統指派身分識別設定為 [開啟] 的狀態。

  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 應用程式,輸入命名空間名稱和事件中樞名稱、訊息,然後選取 [傳送]。 若要接收事件,請選取 [接收]

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 來傳送和接收訊息

範例