Azure 数据工厂的托管标识

适用于: Azure 数据工厂

本文将帮助你了解 Azure 数据工厂中的托管标识(以前称为“托管服务标识/MSI”)及其工作原理。

注意

本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

概述

使用托管标识,则无需管理凭据。 托管标识为服务实例提供一个标识,可以在连接到支持 Azure Active Directory (Azure AD) 身份验证的资源时使用。 例如,该服务可以使用托管标识来访问 Azure Key Vault 等资源,开发人员可以采用安全的方式存储凭据或访问存储帐户。 该服务可以使用托管标识来获取 Azure AD 令牌。

有两种类型的受支持托管标识:

  • 系统分配的标识:可以直接在服务实例上启用托管标识。 如果在创建服务期间允许系统分配的托管标识,则会在与该服务实例的生命周期相关联的 Azure AD 中创建标识。 按照设计,只有该 Azure 资源可以使用此标识从 Azure AD 请求令牌。 因此,资源被删除时,Azure 会自动删除标识。
  • 用户分配:你也可以将托管标识创建为独立的 Azure 资源。 可以创建用户分配的托管标识,并将其分配给一个或多个数据工厂实例。 对于用户分配的托管标识,标识与使用标识的资源分开进行管理。

托管标识提供以下优势:

  • 在 Azure Key Vault 中存储凭据,在这种情况下,托管标识用于 Azure Key Vault 身份验证。
  • 使用托管标识身份验证访问数据存储或计算,包括 Azure Blob 存储、Azure 数据资源管理器、Azure Data Lake Storage Gen2、Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics、REST、Databricks 活动、Web 活动等。 有关详细信息,请查看连接器和活动文章。
  • 托管标识还用于通过存储在 Azure Key Vault 中的客户管理的密钥对数据和元数据进行加密/解密,从而提供双重加密。

系统分配的托管标识

注意

为了向后兼容,系统分配的托管标识在此文档和数据工厂工作室 UI 的其他地方也称为“托管标识”。 我们将在引用时明确提及“用户分配的托管标识”。

生成系统分配的托管标识

系统分配的托管标识按如下方式生成:

  • 通过 Azure 门户或 PowerShell 创建数据工厂时,始终会自动创建托管标识。
  • 通过 SDK 创建数据工厂时,仅当在要创建的工厂对象中指定了“Identity = new FactoryIdentity()”时,才会创建托管标识。 请参阅 .NET 快速入门 - 创建数据工厂中的示例。
  • 通过 REST API 创建数据工厂时,仅当在请求正文中指定了 "identity" 节时,才会创建托管标识。 请参阅 REST 快速入门 - 创建数据工厂中的示例。

如果发现服务实例没有与以下检索托管标识说明相关的托管标识,可以使用标识发起程序以编程方式更新服务实例,从而显式生成一个托管标识:

注意

  • 无法修改托管标识。 更新已包含托管标识的服务实例不会产生任何影响,并且托管标识将保持不变。
  • 如果更新已带有托管标识的数据工厂,但未在工厂对象中指定“identity”参数,或者未在 REST 请求正文中指定“identity”节,将会收到错误。
  • 删除服务实例时,相关联的托管标识将一并删除。

使用 PowerShell 生成系统分配的托管标识

调用 Set-AzDataFactoryV2 命令,然后你会看到正在生成新的“标识”字段:

PS C:\> Set-AzDataFactoryV2 -ResourceGroupName <resourceGroupName> -Name <dataFactoryName> -Location <region>

DataFactoryName   : ADFV2DemoFactory
DataFactoryId     : /subscriptions/<subsID>/resourceGroups/<resourceGroupName>/providers/Microsoft.DataFactory/factories/ADFV2DemoFactory
ResourceGroupName : <resourceGroupName>
Location          : China East 2
Tags              : {}
Identity          : Microsoft.Azure.Management.DataFactory.Models.FactoryIdentity
ProvisioningState : Succeeded

使用 REST API 生成系统分配的托管标识

注意

如果你试图更新已包含托管标识的服务实例,但未在工厂对象中指定“identity”参数,或者未在 REST 请求正文中提供“identity”部分,你将会收到错误 。

调用以下 API 并在请求正文中包含“identity”部分:

PATCH https://management.chinacloudapi.cn/subscriptions/<subsID>/resourceGroups/<resourceGroupName>/providers/Microsoft.DataFactory/factories/<data factory name>?api-version=2018-06-01

请求正文:添加 "identity": { "type": "SystemAssigned" }。

{
    "name": "<dataFactoryName>",
    "location": "<region>",
    "properties": {},
    "identity": {
        "type": "SystemAssigned"
    }
}

响应:自动创建托管标识并相应地填充 "identity" 部分。

{
    "name": "<dataFactoryName>",
    "tags": {},
    "properties": {
        "provisioningState": "Succeeded",
        "loggingStorageAccountKey": "**********",
        "createTime": "2017-09-26T04:10:01.1135678Z",
        "version": "2018-06-01"
    },
    "identity": {
        "type": "SystemAssigned",
        "principalId": "765ad4ab-XXXX-XXXX-XXXX-51ed985819dc",
        "tenantId": "72f988bf-XXXX-XXXX-XXXX-2d7cd011db47"
    },
    "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.DataFactory/factories/<dataFactoryName>",
    "type": "Microsoft.DataFactory/factories",
    "location": "<region>"
}

使用 Azure 资源管理器模板生成系统分配的托管标识

模版:添加 "identity": { "type": "SystemAssigned" }。

{
    "contentVersion": "1.0.0.0",
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "resources": [{
        "name": "<dataFactoryName>",
        "apiVersion": "2018-06-01",
        "type": "Microsoft.DataFactory/factories",
        "location": "<region>",
        "identity": {
            "type": "SystemAssigned"
        }
    }]
}

使用 SDK 生成系统分配的托管标识

结合 Identity=new FactoryIdentity() 调用 create_or_update 函数。 使用 .NET 的示例代码:

Factory dataFactory = new Factory
{
    Location = <region>,
    Identity = new FactoryIdentity()
};
client.Factories.CreateOrUpdate(resourceGroup, dataFactoryName, dataFactory);

检索系统分配的托管标识

可以通过 Azure 门户或以编程方式检索托管标识。 以下部分演示了一些示例。

提示

如果看不到托管标识,请通过更新服务实例来生成托管标识

使用 Azure 门户检索系统分配的托管标识

可以从 Azure 门户 -> 数据工厂 ->“属性”找到托管标识信息。

Shows the Azure portal with the system-managed identity object ID and Identity Tenant for an Azure Data Factory.

  • 托管标识对象 ID
  • 托管标识租户

当你创建支持托管标识身份验证的链接服务(如 Azure Blob、Azure Data Lake Storage、Azure Key Vault 等)时,托管标识信息也会显示。

若要授予权限,请执行以下步骤。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

  1. 选择“访问控制(IAM)”。

  2. 选择“添加”>“添加角色分配”。

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

  3. 在“成员”选项卡上,选择“托管标识”,然后选择“选择成员”。

  4. 选择 Azure 订阅。

  5. 在“系统分配的托管标识”下,选择“数据工厂”,然后选择一个数据工厂。 也可以使用对象 ID 或数据工厂名称(作为托管标识名称)来查找此标识。 若要获取托管标识的应用程序 ID,请使用 PowerShell。

  6. 在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。

使用 PowerShell 检索系统分配的托管标识

获取特定的服务实例时,会返回托管标识主体 ID 和租户 ID,如下所示。 使用 PrincipalId 授予访问权限:

PS C:\> (Get-AzDataFactoryV2 -ResourceGroupName <resourceGroupName> -Name <dataFactoryName>).Identity

PrincipalId                          TenantId
-----------                          --------
765ad4ab-XXXX-XXXX-XXXX-51ed985819dc 72f988bf-XXXX-XXXX-XXXX-2d7cd011db47

可以通过以下方法获取应用程序 ID:复制上面的主体 ID,然后以主体 ID 作为参数运行以下 Azure Active Directory 命令。

PS C:\> Get-AzADServicePrincipal -ObjectId 765ad4ab-XXXX-XXXX-XXXX-51ed985819dc

ServicePrincipalNames : {76f668b3-XXXX-XXXX-XXXX-1b3348c75e02, https://identity.chinacloudapi.cn/P86P8g6nt1QxfPJx22om8MOooMf/Ag0Qf/nnREppHkU=}
ApplicationId         : 76f668b3-XXXX-XXXX-XXXX-1b3348c75e02
DisplayName           : ADFV2DemoFactory
Id                    : 765ad4ab-XXXX-XXXX-XXXX-51ed985819dc
Type                  : ServicePrincipal

使用 REST API 检索托管标识

获取特定的服务实例时,会返回托管标识主体 ID 和租户 ID,如下所示。

在请求中调用以下 API:

GET https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataFactory/factories/{factoryName}?api-version=2018-06-01

响应:你将获得如下所示的响应。 “标识”部分会相应进行填充。

{
    "name":"<dataFactoryName>",
    "identity":{
        "type":"SystemAssigned",
        "principalId":"554cff9e-XXXX-XXXX-XXXX-90c7d9ff2ead",
        "tenantId":"72f988bf-XXXX-XXXX-XXXX-2d7cd011db47"
    },
    "id":"/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.DataFactory/factories/<dataFactoryName>",
    "type":"Microsoft.DataFactory/factories",
    "properties":{
        "provisioningState":"Succeeded",
        "createTime":"2020-02-12T02:22:50.2384387Z",
        "version":"2018-06-01",
        "factoryStatistics":{
            "totalResourceCount":0,
            "maxAllowedResourceCount":0,
            "factorySizeInGbUnits":0,
            "maxAllowedFactorySizeInGbUnits":0
        }
    },
    "eTag":"\"03006b40-XXXX-XXXX-XXXX-5e43617a0000\"",
    "location":"<region>",
    "tags":{

    }
}

提示

若要从 ARM 模板检索托管标识,请在 ARM JSON 中添加“输出”部分:

{
    "outputs":{
        "managedIdentityObjectId":{
            "type":"string",
            "value":"[reference(resourceId('Microsoft.DataFactory/factories', parameters('<dataFactoryName>')), '2018-06-01', 'Full').identity.principalId]"
        }
    }
}

用户分配的托管标识

可以在 Azure Active Directory 中创建、删除、管理用户分配的托管标识。 有关更多详细信息,请参阅使用 Azure 门户创建、列出、删除用户分配的托管标识或为其分配角色

若要使用用户分配的托管标识,必须先在服务实例中为 UAMI 创建凭据

后续步骤

请参阅以下主题,其中介绍了使用托管标识的场景和方式:

请参阅 Azure 资源的托管标识概述,以了解有关 Azure 资源的托管标识(Azure 数据工厂中的托管标识基于这些托管标识)的更多背景信息。