共用方式為


如何將受控識別與 Azure 服務搭配使用,以連線到適用於 NoSQL 的 Azure Cosmos DB

適用於:NoSQL

部署指南序列中目前位置 (『Prepare』) 的圖表。

部署指南順序的圖表,包括這些位置,順序如下:概觀、概念、準備、角色型訪問控制、網路和參考。 「準備」位置目前已醒目提示。

本文會檢閱建立受控識別,以搭配使用連線至 Azure Cosmos DB for NoSQL 的已部署應用程式所需的步驟。

受控識別是 Microsoft Entra ID 中的其中一種身分識別類型,以供應用程式在連線至支援 Microsoft Entra 驗證的資源時使用。 受控識別可用來取代傳統資源擁有的認證 (例如金鑰)。 在 Azure 中,受控識別可讓應用程式取得 Microsoft Entra 權杖以向 Azure 服務進行驗證,而無需撰寫大量的驗證碼。

您可以使用 Microsoft Entra 向 Azure 服務進行驗證,包括但不限於:

  • Azure SQL
  • Azure AI
  • Azure Cosmos DB
  • Azure 儲存體
  • Azure 事件中樞
  • Azure Container Registry

您可以使用受控識別來代表從其他 Azure 服務向 Azure 服務進行驗證的主體,包括但不限於:

  • Azure Kubernetes Service
  • Azure 容器應用程式
  • Azure 虛擬機器
  • Azure Functions
  • Azure App Service
  • Azure Spring Apps
  • Azure Service Fabric

受控識別會啟用多個安全案例,其中各種 Azure 服務可以彼此連線。 這些範例包含:

  • 為 Azure Spring 應用程式中的應用程式建立系統指派的受控識別,以連線和查詢 Azure SQL 帳戶
  • 搭配 Azure Kubernetes Service 和 Azure Functions 使用單一使用者指派的受控識別,以向 Azure AI 帳戶發出要求
  • 使用 Azure Cosmos DB 帳戶的受控識別,以將金鑰儲存在 Azure Key Vault 中

如需詳細資訊,請參閱 Azure 資源的受控識別

必要條件

使用系統指派的受控識別建立 Azure 服務

使用系統指派的受控識別建立新的 Azure 服務。 本節會建立 Azure 容器執行個體資源。

  1. 使用 az container create 來建立新的容器執行個體。 使用 assign-identity 參數,將帳戶設定為使用系統指派的受控識別。

    az container create \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-new-container>" \
        --image mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled \
        --cpu 1 \
        --memory 2 \
        --assign-identity
    
  2. 使用 az container show 和 JMESPath 查詢,取得系統指派的受控識別的詳細資料。

    az container show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-container>" \
        --query "identity"
    
  3. 檢閱命令的輸出。 它應該包含身分識別和租用戶的唯一識別碼。

    {
      "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    }
    
  1. 建立新的 Bicep 檔案來定義新的容器執行個體。 將檔案命名為 container-instance.bicep。 設定容器執行個體的以下屬性:

    name 使用名為 instanceName 的參數
    location 設定為資源群組的位置
    identity.type SystemAssigned
    properties.osType Linux
    properties.containers[0].name aspnet-sample
    properties.containers[0].properties.image mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled
    properties.containers[0].properties.resources.requests.cpu 1
    properties.containers[0].properties.resources.requests.memoryInGB 2
    metadata description = 'Create Azure Container Instance resource with system-assigned managed identity.'
    
    @description('Name of the Azure Container Instances resource.')
    param instanceName string
    
    resource instance 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
      name: instanceName
      location: resourceGroup().location
      identity: {
        type: 'SystemAssigned'
      }
      properties: {
        osType: 'Linux'
        containers: [
          {
            name: 'aspnet-sample'
            properties: {
              image: 'mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled'
              resources: {
                requests: {
                  cpu: 1
                  memoryInGB: 2
                }
              }
            }
          }
        ]
      }
    }
    
    output systemAssignedIdentity object = instance.identity    
    
  2. 建立名為 container-instance.bicepparam 的新 Bicep 參數檔案。 在此參數檔案中,使用 instanceName 參數為您的容器執行個體建立唯一名稱。

    using './container-instance.bicep'
    
    param instanceName = '<name-of-new-container-instance>'
    
  3. 使用 az deployment group create 部署 Bicep 範本。 指定 Bicep 範本、參數檔案和 Azure 資源群組的名稱。

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --parameters "container-instance.bicepparam" \
        --template-file "container-instance.bicep"
    
  4. 檢閱部署的輸出。 輸出包含 properties.outputs.systemAssignedIdentity.value 屬性中容器執行個體的識別物件。

    {
      "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "SystemAssigned"
    }
    
  1. 登入 Azure 入口網站 (https://portal.azure.com)。

  2. 在全域搜尋列中輸入 Azure 容器執行個體

    顯示全域搜尋列的 Azure 入口網站螢幕擷取畫面。

  3. 在 [服務] 中,選取 [容器執行個體]

    在搜尋功能表中選取的 [容器執行個體] 選項的螢幕擷取畫面。

  4. 在 [容器執行個體] 窗格中,選取 [建立]

    Azure 容器執行個體窗格內 [建立] 選項的螢幕擷取畫面。

  5. [基本] 窗格中,設定下列選項,然後選取 [檢閱 + 建立]

    訂用帳戶 選取您的 Azure 訂用帳戶
    資源群組 建立新的資源群組,或選取現有的資源群組
    容器名稱 提供全域唯一名稱
    區域 為您的訂用帳戶選取支援的 Azure 區域

    Azure 容器執行個體資源建立 [基本] 窗格的螢幕擷取畫面。

    提示

    您可以將任何未指定的選項保留為預設值。

  6. [檢閱 + 建立] 窗格中,等候您的帳戶驗證順利完成,然後選取 [建立]

    建立容器執行個體體驗中資源驗證步驟的螢幕擷取畫面。

  7. 入口網站會自動流覽至 [部署] 窗格。 等待部署完成。

  8. 部署完成後,選取 [移至資源] 以瀏覽至新的 Azure 容器執行個體資源。

    已完整部署 Azure 容器執行個體資源的螢幕擷取畫面,其中已醒目提示 [移至資源] 選項。

  9. 在新容器執行個體的窗格內,選取服務功能表 [設定] 區段內的 [身分識別]

    容器執行個體服務功能表中 [身分識別] 選項的螢幕擷取畫面。

  10. 在 [身分識別] 窗格中,將 [狀態] 選項設定為 [開啟],以啟用系統指派的受控識別。 然後,選取 [儲存] 並解決任何認可變更的提示。

    將系統指派的受控識別的狀態設定為 [開啟] 的螢幕擷取畫面。

  11. 系統指派的受控識別準備就緒後,檢閱 [物件 (主體) ID] 屬性。 該屬性值是身分識別的唯一識別碼。

    已啟用的系統指派的受控識別的詳細資料的螢幕擷取畫面。

    提示

    在這裡範例螢幕擷取畫面中,系統指派的受控識別的唯一識別碼是 bbbbbbbb-1111-2222-3333-cccccccccccc

  1. 使用 New-AzContainerInstanceObject 建立代表容器的物件,並將其儲存在名為 $container 的變數中。 然後,使用該容器物件建立具有 New-AzContainerGroup 的新容器執行個體。 將 IdentityType 參數設定為 SystemAssigned,進而將帳戶設定為使用系統指派的受控識別。

    $parameters = @{
        Name = "aspnet-sample"
        Image = "mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled"
        RequestCpu = 1 
        RequestMemoryInGb = 2
    }
    $container = New-AzContainerInstanceObject @parameters
    
    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-new-container>"
        Container = $container
        OsType = "Linux"
        Location = "<azure-region>"
        IdentityType = "SystemAssigned"
    }
    New-AzContainerGroup @parameters
    
  2. 使用 Get-AzContainerGroupFormat-List 並僅選取 Identity 屬性,以取得系統指派的受控識別的詳細資料。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-container>"
    }
    Get-AzContainerGroup @parameters | Format-List Identity
    
  3. 檢閱命令的輸出。 它應該包含身分識別和租用戶的唯一識別碼。

    Identity : {
                 "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
                 "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
                 "type": "SystemAssigned"
               }
    

建立使用者指派的受控識別

建立使用者指派的受控識別,以可攜式方式與一或多個 Azure 服務搭配使用。

  1. 使用 az identity create,以在 Azure 資源群組中建立新的使用者指派的受控識別。

    az identity create \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-new-managed-identity>"
    
  2. 使用 az identity list 取得資源群組中使用者指派的受控識別清單

    az identity list \
        --resource-group "<name-of-existing-resource-group>"    
    
  3. 檢閱命令的輸出。 記錄 id 欄位的值,因為此完整資源識別碼會用來將使用者指派的受控識別指派給您的 Azure 資源。

    {
      "clientId": "11112222-bbbb-3333-cccc-4444dddd5555",
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned",
      "location": "<azure-location>",
      "name": "msdocs-identity-example-user-assigned",
      "principalId": "cccccccc-dddd-eeee-3333-444444444444",
      "resourceGroup": "msdocs-identity-example",
      "systemData": null,
      "tags": {},
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

    注意

    在此範例中,id 值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。

  1. 建立 Bicep 檔案來定義使用者指派的受控識別,並將檔案命名為 user-assigned-managed-identity.bicep。 設定以下最小屬性:

    name 使用名為 identityName 的選擇性參數,並產生唯一預設值
    location 設定為資源群組的位置
    metadata description = 'Create a user-assigned managed identity.'
    
    param identityName string = uniqueString(subscription().id, resourceGroup().id)
    
    resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
      name: identityName
      location: resourceGroup().location
    }
    
    output id string = identity.id
    output name string = identity.name
    
  2. 使用 az deployment group create 部署 Bicep 範本。 指定 Bicep 範本和 Azure 資源群組的名稱。

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --template-file "user-assigned-managed-identity.bicep"
    
  3. 檢閱部署的輸出。 輸出包含 properties.outputs.name.value 屬性中受控識別的唯一識別碼。 請記錄此值,因為本指南稍後建立新的 Azure 資源時需要使用。

    {
      "type": "String",
      "value": "msdocs-identity-example-user-assigned"
    }
    

    注意

    在此範例中,name.value 會是 msdocs-identity-example-user-assigned。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。

  1. 在全域搜尋列中,輸入 [受控識別]

  2. 在 [服務] 中,選取 [受控識別]

    在搜尋功能表中選取的 [受控識別] 選項的螢幕擷取畫面。

  3. 在 [容器執行個體] 窗格中,選取 [建立]

    受控識別窗格內 [建立] 選項的螢幕擷取畫面。

  4. [基本] 窗格中,設定下列選項,然後選取 [檢閱 + 建立]

    訂用帳戶 選取您的 Azure 訂用帳戶
    資源群組 建立新的資源群組,或選取現有的資源群組
    區域 為您的訂用帳戶選取支援的 Azure 區域
    名稱 提供全域唯一名稱

    受控識別資源建立 [基本] 窗格的螢幕擷取畫面。

  5. [檢閱 + 建立] 窗格中,等候您的帳戶驗證順利完成,然後選取 [建立]

    建立受控識別體驗中資源驗證步驟的螢幕擷取畫面。

  6. 入口網站會自動流覽至 [部署] 窗格。 等待部署完成。

  7. 等待受控識別的部署完成。

    完整部署受控識別資源的螢幕擷取畫面。

  1. 使用 Azure 資源群組中的 New-AzUserAssignedIdentity,建立新的使用者指派的受控識別。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-new-managed-identity>"
        Location = "<azure-region>"
    }
    New-AzUserAssignedIdentity @parameters
    
  2. 使用 Get-AzUserAssignedIdentity,以取得資源群組中使用者指派的受控識別清單。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
    }
    Get-AzUserAssignedIdentity @parameters | Format-List Name, Id
    
  3. 檢閱命令的輸出。 記錄 Id 欄位的值,因為此完整資源識別碼會用來將使用者指派的受控識別指派給您的 Azure 資源。

    Name : msdocs-identity-example-user-assigned
    Id   : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned
    

    注意

    在此範例中,Id 值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。

以使用者指派的受控識別建立 Azure 服務

將先前建立的使用者指派的受控識別指派至新的 Azure 託管服務。 本節會建立 Azure App Service Web 應用程式資源。

  1. 使用 az appservice plan create 建立新的 App Service 方案。

    az appservice plan create \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-new-plan>"
    
  2. 使用 az webapp create 將使用者指派的受控識別指派至新的 Web 應用程式。 使用本指南稍早記錄的 id 欄位作為 ssign-identity 參數的值。

    az webapp create \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-web-app>" \
        --plan "<name-of-existing-plan>" \
        --assign-identity "<resource-id-recorded-earlier>"
    
  3. 使用 az webapp show 和 JMESPath 查詢,取得指派至此帳戶的所有身分識別詳細資料。

    az webapp show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-account>" \
        --query "identity"   
    
  4. 檢閱命令的輸出。 其應包含使用者指派的受控識別。

    {
      "principalId": null,
      "tenantId": null,
      "type": "UserAssigned",
      "userAssignedIdentities": {
        "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned": {
          "clientId": "11112222-bbbb-3333-cccc-4444dddd5555",
          "principalId": "cccccccc-dddd-eeee-3333-444444444444"
        }
      }
    }
    
  1. 建立另一個名為 app-service-web-app.bicep 的 Bicep 檔案,並定義 Azure App Service 方案和 Web 應用程式。 設定這些資源的以下屬性:

    資源
    name 現有的受控識別 使用名為 identityName 的參數
    name App Service 方案 使用名為 planName 的參數
    location App Service 方案 設定為資源群組的位置
    name Web 應用程式 使用名為 webAppName 的參數
    location Web 應用程式 設定為資源群組的位置
    identity.type UserAssigned
    identity.userAssignedIdentities.{identity.id} {}
    properties.serverFarmId plan.id
    metadata description = 'Creates an Azure App Service plan and web app with a user-assigned managed identity.'
    
    @description('The name of the app service plan.')
    param planName string
    
    @description('The name of the web app.')
    param webAppName string
    
    @description('The name of the user-assigned managed identity.')
    param identityName string
    
    resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' existing = {
      name: identityName
    }
    
    resource plan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: planName
      location: resourceGroup().location
    }
    
    resource webApp 'Microsoft.Web/sites@2023-12-01' = {
      name: webAppName
      location: resourceGroup().location
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '${identity.id}': {}
        }
      }
      properties: {
        serverFarmId: plan.id
      }
    }
    
    output userAssignedIdentity object = webApp.identity
    
  2. 建立名為 app-service-web-app.bicepparam 的 Bicep 參數檔案。 在此參數檔案中,分別使用 planNamewebAppName 參數,為您的 Web 應用程式和方案建立唯一名稱。 然後,提供使用者指派的受控識別名稱做為 identityName 參數的值。

    using './app-service-web-app.bicep'
    
    param planName = '<name-of-new-app-service-plan>'
    param webAppName = '<name-of-new-web-app>'
    param identityName = '<name-of-existing-managed-identity>'
    
  3. 使用 az deployment group create 部署 Bicep 範本。 指定 Bicep 範本、參數檔案和 Azure 資源群組的名稱。

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --parameters "app-service-web-app.bicepparam" \
        --template-file "app-service-web-app.bicep"
    
  4. 檢閱部署的輸出。 輸出包含 properties.outputs.userAssignedIdentity.value 屬性中容器執行個體的識別物件。

    {
      "type": "UserAssigned",
      "userAssignedIdentities": {
        "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned": {
          "clientId": "11112222-bbbb-3333-cccc-4444dddd5555",
          "principalId": "cccccccc-dddd-eeee-3333-444444444444"
        }
      }
    }
    
  1. 在全域搜尋列中輸入 [Web 應用程式]

  2. 在 [服務] 中,選取 [應用程式服務]

    在搜尋功能表中選取的 [應用程式服務] 選項的螢幕擷取畫面。

  3. 在 [應用程式服務] 窗格中,選取 [建立],然後選取 [Web 應用程式]

    Azure App Service 窗格內 [建立] 和 [Web 應用程式] 選項的螢幕擷取畫面。

  4. [基本] 窗格中,設定下列選項,然後選取 [檢閱 + 建立]

    訂用帳戶 選取您的 Azure 訂用帳戶
    資源群組 建立新的資源群組,或選取現有的資源群組
    名稱 提供全域唯一名稱
    計劃 建立新的方案,或選取現有方案

    Web 應用程式資源建立 [基本] 窗格的螢幕擷取畫面。

  5. [檢閱 + 建立] 窗格中,等候您的帳戶驗證順利完成,然後選取 [建立]

    建立 Web 應用程式資源體驗中資源驗證步驟的螢幕擷取畫面。

  6. 入口網站會自動流覽至 [部署] 窗格。 等待部署完成。

  7. 部署完成後,選取 [移至資源] 以瀏覽至新的 Azure 容器執行個體資源。

    已完整部署 Azure App Service Web 應用程式資源的螢幕擷取畫面,其中已醒目提示 [移至資源] 選項。

  8. 在新容器執行個體的窗格內,選取服務功能表 [設定] 區段內的 [身分識別]

    Web 應用程式服務功能表中 [身分識別] 選項的螢幕擷取畫面。

  9. 在 [身分識別] 窗格上,選取 [使用者指派] 選項。

    Web 應用程式的 [身分識別] 窗格中 [使用者指派] 選項的螢幕擷取畫面。

  10. 選取 [新增] 開啟對話方塊,以指派現有的使用者指派的受控識別。 在對話方塊中,選取您現有的使用者指派的受控識別,然後選取 [新增]

    Web 應用程式的 [身分識別] 窗格中 [新增] 選項和 [新增使用者指派的受控識別] 對話方塊的螢幕擷取畫面。

  11. 最後,檢閱與 Web 應用程式關聯的使用者指派的受控識別的清單。 其應包含身分識別的名稱、資源群組名稱和訂用帳戶識別碼。

    與目前 Web 應用程式關聯的使用者指派的受控識別清單的螢幕擷取畫面。

  1. 使用 New-AzWebApp 建立新的 Azure App Service Web 應用程式。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-new-web-app>"
        Location = "<azure-region>"
    }
    New-AzWebApp @parameters
    
  2. 修補新建立的 Web 應用程式,將 identity.type 屬性設定為 UserAssigned,並將現有的使用者指派的受控識別新增至 identity.userAssignedIdentities 屬性。 若要完成這項工作,請先提供本指南稍早記錄的做為 identityId 命令介面變數的值的 id 欄位。 然後,建構酬載物件,並將其轉換為 JSON。 最後,搭配使用 Invoke-AzRestMethodPATCH HTTP 指令動詞來更新現有的 Web 應用程式。

    $identityId = "<resource-id-recorded-earlier>"
    
    $payload = @{
        identity = @{
            type = "UserAssigned"
            userAssignedIdentities = @{
                "$identityId" = @{}
            }
        }
    } | ConvertTo-Json -Depth 3
    
    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-web-app>"
        ResourceProviderName = 'Microsoft.Web'
        ResourceType = 'sites'
        ApiVersion = '2023-12-01'
        Method = 'PATCH'
        Payload = $payload
    }
    Invoke-AzRestMethod @parameters
    
  3. 使用 Get-AzWebAppSelect-ObjectConvertTo-Json 並僅選取 Identity 屬性,以取得指派至 Web 應用程式的所有身分識別的詳細資料。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-web-app>"
    }
    Get-AzWebApp @parameters | Select-Object Identity | ConvertTo-Json -Depth 3
    
  4. 檢閱命令的輸出。 它應該包含身分識別和租用戶的唯一識別碼。

    {
      "Identity": {
        "Type": "UserAssigned",
        "TenantId": null,
        "PrincipalId": null,
        "UserAssignedIdentities": {
          "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.ManagedIdentity/userAssignedIdentities/msdocs-identity-example-user-assigned": {
            "PrincipalId": "cccccccc-dddd-eeee-3333-444444444444",
            "ClientId": "11112222-bbbb-3333-cccc-4444dddd5555"
          }
        }
      }
    }
    

後續步驟