你当前正在访问 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 角色

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

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

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

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

  4. 选择 Azure 订阅。

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

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

使用 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 数据工厂中的托管标识。