你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 数据工厂的托管标识

适用于: Azure 数据工厂 Azure Synapse Analytics

提示

试用 Microsoft Fabric 中的数据工厂,这是一种适用于企业的一站式分析解决方案。 Microsoft Fabric 涵盖从数据移动到数据科学、实时分析、商业智能和报告的所有内容。 了解如何免费开始新的试用

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

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

概述

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

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

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

注意

受信任的旁路不能利用用户分配的托管标识。 它只能使用系统分配的托管标识连接到 Azure 存储和 Azure Key Vault。

托管标识提供以下优势:

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

托管标识所需的角色

若要有效使用 Azure 数据工厂中的托管标识,必须分配特定角色,以确保适当的访问和功能。 以下是所需的角色:

  • 系统分配的托管标识

    • 读取者角色:此角色是读取资源元数据所必需的。
    • 参与者角色:需要此角色来管理托管标识需要访问的资源。
  • 用户分配的托管标识

    • 托管标识操作员角色:此角色允许管理用户分配的托管标识。
    • 读取者角色:此角色是读取资源元数据所必需的。
    • 参与者角色:需要此角色来管理托管标识需要访问的资源。

系统分配的托管标识

注意

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

生成系统分配的托管标识

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

  • 通过 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          : East US
Tags              : {}
Identity          : Microsoft.Azure.Management.DataFactory.Models.FactoryIdentity
ProvisioningState : Succeeded

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

注意

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

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

PATCH https://management.azure.com/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": "aaaaaaaa-bbbb-cccc-1111-222222222222",
        "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
    },
    "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 门户 -> 数据工厂 ->“属性”找到托管标识信息。

显示具有 Azure 数据工厂的系统托管标识对象 ID 和标识租户的 Azure 门户。

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

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

若要向 Azure 数据源授予数据工厂托管标识的权限,请执行以下步骤。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

  1. 在数据源的 Azure 门户页上,选择“访问控制(IAM)”

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

    显示打开了“添加角色分配”菜单的“访问控制(IAM)”页的屏幕截图。

  3. 选择所需的角色,以授予对数据源所需的访问权限。 这可能因数据工厂所需的数据源和权限而异。 例如,如果数据工厂仅需从 Azure SQL Server 进行读取,请选择“读取者”角色

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

  5. 选择 Azure 订阅。

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

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

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

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

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

PrincipalId                          TenantId
-----------                          --------
aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb aaaabbbb-0000-cccc-1111-dddd2222eeee

可通过复制上面的主体 ID 并将主体 ID 作为参数运行以下 Microsoft Entra ID 命令来获取应用程序 ID。

PS C:\> Get-AzADServicePrincipal -ObjectId aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb

ServicePrincipalNames : {00001111-aaaa-2222-bbbb-3333cccc4444, https://identity.azure.net/P86P8g6nt1QxfPJx22om8MOooMf/Ag0Qf/nnREppHkU=}
ApplicationId         : 00001111-aaaa-2222-bbbb-3333cccc4444
DisplayName           : ADFV2DemoFactory
Id                    : aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Type                  : ServicePrincipal

使用 REST API 检索托管标识

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

在请求中调用以下 API:

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

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

{
    "name":"<dataFactoryName>",
    "identity":{
        "type":"SystemAssigned",
        "principalId":"bbbbbbbb-cccc-dddd-2222-333333333333",
        "tenantId":"aaaabbbb-0000-cccc-1111-dddd2222eeee"
    },
    "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]"
        }
    }
}

用户分配的托管标识

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

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

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

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

请参阅托管标识的限制,这也适用于 Azure 数据工厂中的托管标识。