IoT 中樞支援受控識別

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

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

必要條件

系統指派的受控識別

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

  1. 登入Azure 入口網站並流覽至您的 IoT 中樞。

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

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

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

    注意

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

    Screenshot showing where to turn on system-assigned managed identity for an IoT hub.

使用 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 中樞移除它,而且此移除不會刪除使用者指派的身分識別作為資源。 若要將使用者指派的身分識別刪除為資源,請遵循刪除使用者指派的受控識別 中的 指示。

    Screenshot showing how to add user-assigned managed identity for an I O T hub.

使用 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. 選取 [新增 > 角色指派 ]。

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

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

    注意

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

    Screenshot showing Add role assignment page with Role tab selected.

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

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

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

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

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

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

    注意

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

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

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

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

    Screenshot that shows event hub endpoint with user assigned authentication.

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

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

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

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

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

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

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

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

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

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

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

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

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

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

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

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

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

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

    注意

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

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

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

    Screen shot that shows file upload with msi.

    注意

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

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

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

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

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

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

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

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

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

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

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

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

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

使用 REST API 或 SDK 進行匯入和匯出作業

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

  • storageAuthenticationType :將值設定為 identityBased
  • inputBlobContainerUri :只在匯入作業中設定此屬性。
  • outputBlobContainerUri :針對匯入和匯出作業設定此屬性。
  • identity :將值設定為要使用的受控識別。

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 中樞功能: