共用方式為


IoT 中樞支援受控識別

受控識別在 Microsoft Entra ID 中以安全的方式為 Azure 服務提供自動受控的身分識別。 這可消除開發人員必須藉由提供身分識別來管理認證的需求。 有兩種受控識別:系統指派和使用者指派。 IoT 中樞同時支援這兩者。

在 IoT 中樞中,受控識別可用於從 IoT 中樞到其他 Azure 服務的輸出連線,以取得各種功能,例如訊息路由檔案上傳以及大量裝置匯入/匯出。 在本文中,您將了解如何在 IoT 中樞內針對不同的功能使用系統指派和使用者指派的受控識別。

必要條件

系統指派的受控識別

在 Azure 入口網站中啟用或停用系統指派的受控識別

  1. 登入 Azure 入口網站,然後瀏覽至 IoT 中樞。

  2. 從導覽功能表的 [安全性設定] 區段中,選取 [身分識別]

  3. 選取 [系統指派的] 索引標籤。

  4. 將系統指派受控識別的 [狀態] 設定為 [開啟] 或 [關閉],然後選取 [儲存]

    注意

    若系統指派的受控識別正在使用,您就無法將其關閉。 停用此功能之前,請確定沒有任何自訂端點正在使用系統指派的受控識別驗證。

    此螢幕快照顯示開啟IoT中樞系統指派受控識別的位置。

使用 ARM 範本在中樞建立時啟用系統指派的受控識別

若要在資源佈建時在 IoT 中樞內啟用系統指派的受控識別,請使用下方的 Azure Resource Manager (ARM) 範本。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": 
    {
      "iotHubName": {
        "type": "string",
        "metadata": {
          "description": "Name of iothub resource"
        }
      },
      "skuName": {
        "type": "string",
        "defaultValue": "S1",
        "metadata": {
          "description": "SKU name of iothub resource, by default is Standard S1"
        }
      },
      "skuTier": {
        "type": "string",
        "defaultValue": "Standard",
        "metadata": {
          "description": "SKU tier of iothub resource, by default is Standard"
        }
      },
      "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
          "description": "Location of iothub resource. Please provide any of supported-regions of iothub"
        }
      }
    },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "createIotHub",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Devices/IotHubs",
              "apiVersion": "2021-03-31",
              "name": "[parameters('iotHubName')]",
              "location": "[parameters('location')]",
              "identity": {
                "type": "SystemAssigned"
              },
              "sku": {
              "name": "[parameters('skuName')]",
              "tier": "[parameters('skuTier')]",
              "capacity": 1
              }
            }
          ] 
        }
      }
    }
  ]
}

取代資源 namelocationSKU.nameSKU.tier 的值之後,您可以使用 Azure CLI 在現有的資源群組中使用下列項目來部署資源:

az deployment group create --name <deployment-name> --resource-group <resource-group-name> --template-file <template-file.json> --parameters iotHubName=<valid-iothub-name> skuName=<sku-name> skuTier=<sku-tier> location=<any-of-supported-regions>

建立資源之後,您可以使用 Azure CLI 擷取指派給中樞的系統指派:

az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>

使用者指派的受控識別

在本節中,您會了解如何使用 Azure 入口網站在 IoT 中樞內新增和移除使用者指派的受控識別。

  1. 首先,您必須建立使用者指派的受控識別作為獨立資源。 若要這樣做,您可以遵循建立使用者指派的受控識別中的指示。

  2. 移至您的 IoT 中樞,然後瀏覽至 IoT 中樞入口網站中的身分識別

  3. 在 [使用者指派] 索引標籤下,按一下 [為使用者指派的受控識別建立關聯]。 選擇您要新增至中樞的使用者指派受控識別,然後按一下 [選取]

  4. 您可以從 IoT 中樞移除使用者指派的身分識別。 選擇您想要移除的使用者指派身分識別,然後按一下 [移除] 按鈕。 請注意,您只會從 IoT 中樞將其移除,且此移除不會刪除使用者指派的身分識別作為資源。 若要將使用者指派的身分識別刪除為資源,請遵循刪除使用者指派的受控識別中的指示。

    顯示如何為 I O T 中樞新增使用者指派受控識別的螢幕快照。

使用 ARM 範本在中樞建立時啟用使用者指派的受控識別

下列範例範本可用來建立具有使用者指派受控識別的中樞。 此範本會建立一個使用者指派的身分識別,其名稱為 [iothub-name-provided]-identity,且會指派給建立的 IoT 中樞。 您可以視需要變更範本以新增多個使用者指派的身分識別。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "iotHubName": {
      "type": "string",
      "metadata": {
        "description": "Name of iothub resource"
      }
    },
  "skuName": {
    "type": "string",
    "defaultValue": "S1",
    "metadata": {
      "description": "SKU name of iothub resource, by default is Standard S1"
    }
  },
  "skuTier": {
    "type": "string",
    "defaultValue": "Standard",
    "metadata": {
      "description": "SKU tier of iothub resource, by default is Standard"
    }
  },
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]",
    "metadata": {
      "description": "Location of iothub resource. Please provide any of supported-regions of iothub"
    }
  }
},
  "variables": {
    "identityName": "[concat(parameters('iotHubName'), '-identity')]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "createIotHub",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
              "name": "[variables('identityName')]",
              "apiVersion": "2018-11-30",
              "location": "[resourceGroup().location]"
            },
            {
              "type": "Microsoft.Devices/IotHubs",
              "apiVersion": "2021-03-31",
              "name": "[parameters('iotHubName')]",
              "location": "[parameters('location')]",
              "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                  "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('identityName'))]": {}
                }
              },
              "sku": {
                "name": "[parameters('skuName')]",
                "tier": "[parameters('skuTier')]",
                "capacity": 1
              },
              "dependsOn": [
                "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('identityName'))]"
              ]
            }
          ]
        }
      }
    }
  ]
}
az deployment group create --name <deployment-name> --resource-group <resource-group-name> --template-file <template-file.json> --parameters iotHubName=<valid-iothub-name> skuName=<sku-name> skuTier=<sku-tier> location=<any-of-supported-regions>

建立資源之後,您可以使用 Azure CLI 在中樞內擷取使用者指派的受控識別:

az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>

從 IoT 中樞輸出連線到其他 Azure 資源

受控識別可用於從 IoT 中樞到其他 Azure 服務的輸出連線,例如訊息路由檔案上傳以及大量裝置匯入/匯出。 您可以選擇要用於每個 IoT 中樞輸出連線至客戶擁有端點的受控識別,包括儲存體帳戶、事件中樞和服務匯流排端點。

注意

只有系統指派的受控識別,才能提供 IoT 中樞對私人資源的存取權。 如果您想要使用使用者指派的受控識別,則必須啟用這些私人資源的公用存取權,才能允許連線。

使用受控識別設定訊息路由

在此節中,我們使用訊息路由至事件中樞自訂端點作為範例。 此範例也適用於其他路由自訂端點。

  1. 在 Azure 入口網站中,移至您的事件中樞,為受控識別指派適當的存取權。

  2. 選取 [存取控制 (IAM)]。

  3. 選取 [新增] > [新增角色指派]。

    顯示 [存取控制] 頁面的螢幕快照,其中已開啟 [新增角色指派] 功能表。

  4. 在 [角色] 索引標籤上,選取 [Azure 事件中樞資料傳送者]

    注意

    針對儲存體帳戶,選取 [儲存體 Blob 資料參與者] (而非參與者或儲存體帳戶參與者) 做為角色。 針對服務匯流排,選取 [Azure 服務匯流排資料傳送者]

    顯示 [新增角色指派] 頁面的螢幕快照,其中已選取 [角色] 索引標籤。

  5. 在 [成員] 索引標籤上,選取 [受控識別],然後選取 [選取成員]

  6. 針對使用者指派的受控識別,選取您的訂閱,選取 [使用者指派的受控識別],然後選取您的使用者指派的受控識別。

  7. 針對系統指派的受控識別,選取您的訂閱,選取 [所有系統指派的受控識別],然後選取您 IoT 中樞的資源名稱。

  8. 在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。

    如需角色指派的詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色

  9. 如果您需要透過 VNet 限制自訂端點的連線能力,則必須開啟受信任的 Microsoft 第一方例外狀況,以為您的 IoT 中樞提供對特定端點的存取權。 例如,如果您要新增事件中樞自訂端點,請瀏覽至事件中樞內的 [防火牆和虛擬網路] 索引標籤,然後啟用 [允許從選取的網路存取] 選項。 在 [例外] 清單下,核取 [允許信任的 Microsoft 服務存取此事件中樞] 核取方塊。 按一下 [儲存] 按鈕。 這也適用於儲存體帳戶和服務匯流排。 深入了解虛擬網路的 IoT 中樞支援

    注意

    您必須完成上述步驟,才能將受控識別指派為正確的存取權,然後再將事件中樞新增為 IoT 中樞內的自訂端點。 請等待幾分鐘讓角色指派進行傳播。

  10. 接下來,移至您的 IoT 中樞。 在您的中樞,瀏覽至 [訊息路由],然後選取 [新增]

  11. 在 [端點] 索引標籤上,提供下列資訊來為事件中樞建立端點:

    參數
    端點類型 選取 [事件中樞]
    端點名稱 為新端點提供唯一名稱,或選取 [選取現存的項目] 來選擇現有的事件中樞端點。
    事件中樞命名空間 使用下拉式功能表來選取訂用帳戶中的現有事件中樞命名空間。
    事件中樞執行個體 使用下拉式功能表來選取命名空間中的現有事件中樞。
    驗證類型 選取 [使用者指派],然後使用下拉式功能表來選取您在事件中樞建立的使用者指派的身分識別

    顯示事件中樞端點與使用者指派驗證的螢幕快照。

  12. 選取 [建立 + 下一步]。 您可以透過精靈繼續建立指向此端點的路由,也可以關閉精靈。

您可以變更現有自訂端點的驗證類型。 使用下列步驟來修改端點:

  1. 在 IoT 中樞,選取左側瀏覽窗格中的 [訊息路由],然後選取 [自訂端點]

  2. 選取您要修改之自訂端點的核取方塊,然後選取 [變更驗證類型]

  3. 針對此端點選擇新的驗證類型,然後選取 [儲存]

使用受控識別設定檔案上傳

IoT 中樞的檔案上傳功能可讓裝置將檔案上傳至客戶所擁有儲存體帳戶。 若要讓檔案上傳正常運作, IoT 中樞必須具有與儲存體帳戶的連線。 與訊息路由類似,您可以挑選慣用的驗證類型和受控識別,以用於對您 Azure 儲存體帳戶的 IoT 中樞輸出連線。

  1. 在 Azure 入口網站中,瀏覽至您的儲存體帳戶。

  2. 選取 [存取控制 (IAM)]。

  3. 選取 [新增] > [新增角色指派]。

    顯示 [存取控制] 頁面的螢幕快照,其中已開啟 [新增角色指派] 功能表。

  4. 在 [角色] 索引標籤上,選取 [儲存體 Blob 資料參與者]。 (請勿選取 [參與者] 或 [儲存體帳戶參與者]。)

  5. 在 [成員] 索引標籤上,選取 [受控識別],然後選取 [選取成員]

  6. 針對使用者指派的受控識別,選取您的訂閱,選取 [使用者指派的受控識別],然後選取您的使用者指派的受控識別。

  7. 針對系統指派的受控識別,選取您的訂閱,選取 [所有系統指派的受控識別],然後選取您 IoT 中樞的資源名稱。

  8. 在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。

    如需角色指派的詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色

    如果您需要透過 VNet 限制儲存體帳戶的連線能力,則必須開啟受信任的 Microsoft 第一方例外狀況,以為您的 IoT 中樞提供對儲存體帳戶的存取權。 在您的儲存體帳戶資源頁面上,瀏覽至 [防火牆和虛擬網路] 索引標籤,然後啟用 [允許從選取的網路存取] 選項。 在 [例外] 清單下,核取 [允許信任的 Microsoft 服務存取此儲存體帳戶] 核取方塊。 按一下 [儲存] 按鈕。 深入了解虛擬網路的 IoT 中樞支援

    注意

    您必須完成上述步驟,為受控識別指派正確的存取權,然後才能使用受控識別將儲存體帳戶儲存在 IoT 中樞內,以用於上傳檔案。 請等待幾分鐘讓角色指派進行傳播。

  9. 在 IoT 中樞的資源頁面上,瀏覽至 [檔案上傳] 索引標籤。

  10. 在顯示的頁面上,選取想要在 blob 儲存體中使用的容器,然後視需要設定 [檔案通知設定]、[SAS TTL]、[預設 TTL] 和 [最大傳遞計數]。 選擇慣用的驗證類型,然後按一下 [儲存]。 如果您在此步驟收到錯誤,請暫時將您的儲存體帳戶設定為允許從 所有網路存取,然後再試一次。 一旦檔案上傳設定完成,您就可以在儲存體帳戶上設定防火牆。

    顯示使用 msi 上傳檔案的螢幕快照。

    注意

    在檔案上傳案例中,中樞和您的裝置都必須與您的儲存體帳戶連線。 上述步驟適用於使用所需的驗證類型將 IoT 中樞連線至儲存體帳戶。 您仍需要使用 SAS URI 將裝置連線至儲存體。 現在系統會使用連接字串來產生 SAS URI。 我們即將新增支援,以使用受控識別產生 SAS URI。 請遵循檔案上傳中的步驟。

使用受控識別設定大量裝置匯入/匯出

IoT 中樞支援在客戶提供的儲存體 Blob 中大量匯入/匯出裝置資訊的功能。 這項功能需要從 IoT 中樞連線到儲存體帳戶。

  1. 在 Azure 入口網站中,瀏覽至您的儲存體帳戶。

  2. 選取 [存取控制 (IAM)]。

  3. 選取 [新增] > [新增角色指派]。

    顯示 [存取控制] 頁面的螢幕快照,其中已開啟 [新增角色指派] 功能表。

  4. 在 [角色] 索引標籤上,選取 [儲存體 Blob 資料參與者]。 (請勿選取 [參與者] 或 [儲存體帳戶參與者]。)

  5. 在 [成員] 索引標籤上,選取 [受控識別],然後選取 [選取成員]

  6. 針對使用者指派的受控識別,選取您的訂閱,選取 [使用者指派的受控識別],然後選取您的使用者指派的受控識別。

  7. 針對系統指派的受控識別,選取您的訂閱,選取 [所有系統指派的受控識別],然後選取您 IoT 中樞的資源名稱。

  8. 在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。

    如需角色指派的詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色

將 REST API 或 SDK 用於匯入和匯出工作

您現在可以使用 Azure IoT REST API 來建立匯入和匯出工作。 您將必須在要求本文中提供下列屬性:

  • storageAuthenticationType:將值設定為 identityBased
  • inputBlobContainerUri:只在匯入工作中設定此屬性。
  • outputBlobContainerUri:在匯入與匯出工作中一併設定此屬性。
  • 身分識別:將值設定為要使用的受控識別。

Azure IoT 中樞 SDK 也會在服務用戶端的登錄管理員中支援這項功能。 下列程式碼片段示範如何使用 C# SDK 來啟動匯入作業或匯出作業。

C# 程式碼片段

    // Create an export job
 
    using RegistryManager srcRegistryManager = RegistryManager.CreateFromConnectionString(hubConnectionString);
 
    JobProperties jobProperties = JobProperties.CreateForExportJob(
        outputBlobContainerUri: blobContainerUri,
        excludeKeysInExport: false,
        storageAuthenticationType: StorageAuthenticationType.IdentityBased,
        identity: new ManagedIdentity
        {
            userAssignedIdentity = userDefinedManagedIdentityResourceId
        });
    // Create an import job
    
    using RegistryManager destRegistryManager = RegistryManager.CreateFromConnectionString(hubConnectionString);
 
    JobProperties jobProperties = JobProperties.CreateForImportJob(
        inputBlobContainerUri: blobContainerUri,
        outputBlobContainerUri: blobContainerUri,
        storageAuthenticationType: StorageAuthenticationType.IdentityBased,
        identity: new ManagedIdentity
        {
            userAssignedIdentity = userDefinedManagedIdentityResourceId
        });

Python 程式碼片段

# see note below
iothub_job_manager = IoTHubJobManager("<IoT Hub connection string>")

# Create an import job
result = iothub_job_manager.create_import_export_job(JobProperties(
    type="import",
    input_blob_container_uri="<input container URI>",
    output_blob_container_uri="<output container URI>",
    storage_authentication_type="identityBased",
    identity=ManagedIdentity(
        user_assigned_identity="<resource ID of user assigned managed identity>"
    )
))

# Create an export job
result = iothub_job_manager.create_import_export_job(JobProperties(
    type="export",
    output_blob_container_uri="<output container URI>",
    storage_authentication_type="identityBased",
    exclude_keys_in_export=True,
    identity=ManagedIdentity(
        user_assigned_identity="<resource ID of user assigned managed identity>"
    ) 
))

注意

  • 如果 storageAuthenticationType 設定為 identityBased,且 userAssignedIdentity 屬性不是 Null,則工作將會使用指定的使用者指派受控識別。
  • 如果未使用 userAssignedIdentity中指定的使用者指派受控識別來設定 IoT 中樞,則工作將會失敗。
  • 如果 storageAuthenticationType 設定為 identityBased,且 userAssignedIdentity 屬性為 Null,則工作將會使用系統指派的身分識別。
  • 如果未使用使用者指派的受控識別來設定 IoT 中樞,則工作將會失敗。
  • 如果 storageAuthenticationType 設定為 identityBased ,且中樞上未設定使用者指派系統指派的受控識別,則工作將會失敗。

SDK 範例

下一步

若要深入了解 IoT 中樞功能,請使用下列連結: