分享方式:


使用 Microsoft Entra ID 來驗證受控識別,以存取 Azure 服務匯流排資源

Azure 資源受控識別會在 Microsoft Entra ID 中為 Azure 服務提供自動受控識別。 您可以使用此身分識別來向任何支援 Microsoft Entra 驗證的服務 (例如,Azure 服務匯流排) 進行驗證,完全不需要程式碼中的認證。 如果您不熟悉受控識別,請參閱 Azure 資源的受控識別,再繼續閱讀本文。

以下是使用受控識別來存取服務匯流排實體的高階步驟:

  1. 為您的用戶端應用程式或環境啟用受控識別。 例如,為您的 Azure App Service 應用程式、Azure Functions 應用程式或執行應用程式的虛擬機器啟用受控識別。 以下是協助您進行此步驟的文章:

  2. 將 Azure 服務匯流排資料擁有者、Azure 服務匯流排資料傳送者或 Azure 服務匯流排資料接收者角色指派給適當範圍的受控識別 (Azure 訂用帳戶、資源群組、服務匯流排命名空間或服務匯流排佇列或主題)。 如需將角色指派給受控識別的指示,請參閱使用 Azure 入口網站指派 Azure 角色

  3. 在您的應用程式中,使用受控識別和服務匯流排命名空間的端點來聯機到命名空間。

    例如,在 .NET 中,您可以使用採用 TokenCredentialfullyQualifiedNamespace (字串,例如:cotosons.servicebus.windows.net) 的 ServiceBusClient 建構函式) 參數,以使用受控識別連線到服務匯流排。 您會傳入 DefaultAzureCredential,其衍生自 TokenCredential 並使用受控識別。 在 DefaultAzureCredentialOptions 中,將 ManagedIdentityClientId 設定為用戶端受控識別的識別碼。

    string fullyQualifiedNamespace = "<your namespace>.servicebus.windows.net>";
    string userAssignedClientId = "<your managed identity client ID>";
    
    var credential = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = userAssignedClientId
        });
    
    var sbusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
    

    重要

    您可以停用服務匯流排命名空間的本機或 SAS 金鑰驗證,只允許透過 Microsoft Entra 驗證。 如需逐步指示,請參閱停用本機驗證

Azure 服務匯流排的 Azure 內建角色

Microsoft Entra 會透過 Azure 角色型存取控制 (RBAC) (部分機器翻譯) 來授與受保護資源的存取權。 Azure 服務匯流排會定義一組 Azure 內建角色,其中包含用來存取服務匯流排實體的一般權限集合。 您也可以定義自訂角色以存取資料。

Azure 提供下列 Azure 內建角色,以授權存取服務匯流排命名空間:

若要在 Azure 入口網站中將角色指派給受控識別,請使用存取控制 (IAM) 頁面。 在 [服務匯流排命名空間] 頁面或 [服務匯流排佇列] 頁面或 [服務匯流排主題] 頁面上選取 [存取控制 (IAM)],以瀏覽至此頁面。 如需指派角色的逐步指示,請參閱使用 Azure 入口網站指派 Azure 角色

資源範圍

將 Azure 角色指派給受控識別之前,請先判斷受控識別應該具有的存取範圍。 最佳做法指出,最好只授與最窄的可能範圍。

下列清單說明您可以將服務匯流排資源的存取範圍設定在什麼層級 (從最小的範圍開始):

  • 佇列主題訂閱:角色指派適用於特定的服務匯流排實體。

  • 服務匯流排命名空間:角色指派橫跨命名空間下服務匯流排的整個拓撲。

  • 資源群組:角色指派會套用至資源群組下的所有服務匯流排資源。

  • 訂用帳戶:角色指派會套用至訂用帳戶中所有資源群組的所有服務匯流排資源。

    注意

    請記住,Azure 角色指派最多可能需要五分鐘的時間傳播。

目前,Azure 入口網站不支援將使用者/群組/受控識別指派給主題訂用帳戶層級的服務匯流排 Azure 角色。 以下是使用 Azure CLI 命令的範例:az-role-assignment-create 能將身分識別指派給服務匯流排 Azure 角色:

az role assignment create \
    --role $service_bus_role \
    --assignee $assignee_id \
    --scope /subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.ServiceBus/namespaces/$service_bus_namespace/topics/$service_bus_topic/subscriptions/$service_bus_subscription

如需內建角色定義方式的詳細資訊,請參閱了解角色定義。 如需建立 Azure 自訂角色的相關資訊,請參閱 Azure 自訂角色

使用 SDK

在 .NET 中,ServiceBusClient 物件是使用採用完整命名空間和 TokenCredential 的建構函式來初始化。 DefaultAzureCredential 衍生自 TokenCredential,其會自動使用為應用程式設定的受控識別。 受控識別內容到服務匯流排和授權交握的流程,都是由權杖認證自動處理。 它是比使用 SAS 更簡單的模型。

var client = new ServiceBusClient('cotosons.servicebus.windows.net', new DefaultAzureCredential());

您可以使用 ServiceBusSenderServiceBusReceiverServiceBusProcessor 一般傳送和接收訊息。

如需使用受控識別來傳送和接收訊息的完整逐步指示,請參閱下列快速入門。 這些快速入門具有使用服務主體來傳送和接收訊息的程式碼,但程式代碼與使用受控識別相同。

注意

受控識別只能在 Azure 環境中、在應用程式服務、Azure VM 和擴展集上運作。 對於 .NET 應用程式,Microsoft.Azure.Services.AppAuthentication 程式庫 (由服務匯流排 NuGet 套件使用) 提供讓應用程式透過此通訊協定進行提取的功能,也能支援本機部署經驗。 該程式庫還能讓您使用來自 Visual Studio、Azure CLI 2.0 或 Active Directory 整合式驗證的使用者帳戶,在部署機器上以本機方式測試程式碼。 如需使用此程式庫的本機開發選項詳細資訊,請參閱使用 .NET 對 Azure Key Vault 進行服務對服務驗證

下一步

請參閱 GitHub上的這個 .NET Web 應用程式範例,此範例會使用受控識別來連線到服務匯流排來傳送和接收訊息。 將應用程式服務的身分識別新增至 Azure 服務匯流排資料擁有者角色。