你当前正在访问 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 门户 -> 数据工厂 ->“属性”找到托管标识信息。
- 托管标识对象 ID
- 托管标识租户
当你创建支持托管标识身份验证的链接服务(如 Azure Blob、Azure Data Lake Storage、Azure Key Vault 等)时,托管标识信息也会显示。
若要授予权限,请执行以下步骤。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色。
选择“访问控制(IAM)”。
选择“添加”>“添加角色分配”。
在“成员”选项卡上,选择“托管标识”,然后选择“选择成员”。
选择 Azure 订阅。
在“系统分配的托管标识”下,选择“数据工厂”,然后选择一个数据工厂。 也可以使用对象 ID 或数据工厂名称(作为托管标识名称)来查找此标识。 若要获取托管标识的应用程序 ID,请使用 PowerShell。
在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。
使用 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 数据工厂中的托管标识。