在 Azure 逻辑应用中使用托管标识验证对 Azure 资源的访问权限

在逻辑应用工作流中,某些触发器和操作支持使用托管标识对受 Azure Active Directory (Azure AD) 保护的资源进行身份验证。 此标识以前称为托管服务标识 (MSI)。 逻辑应用资源使用托管标识进行身份验证时,无需提供凭据、密码或 Azure AD 令牌。 由 Azure 来管理此标识并帮助保护身份验证信息的安全,因为你无需管理这种敏感信息。

Azure 逻辑应用支持系统分配的托管标识用户分配的托管标识,但这些标识类型之间存在以下差异:

  • 逻辑应用资源只能启用和使用一个系统分配的唯一标识。

  • 逻辑应用资源可以在其他逻辑应用资源组中共享相同的用户分配的标识。

  • 根据逻辑应用资源类型,你可以启用系统分配的标识、用户分配的标识或同时启用这两种标识:

    逻辑应用资源类型 环境 托管标识支持
    消耗 - 多租户 Azure 逻辑应用 - 你可以在逻辑应用资源上启用系统分配的标识类型或用户分配的标识类型。

    - 如果启用了用户分配的标识类型,则逻辑应用资源在任何时候都只能有一个用户分配的标识。

    - 可以在逻辑应用资源级别和连接级别使用标识。

    Standard - 单租户 Azure 逻辑应用 - 可以同时启用系统分配的标识类型(默认启用)和用户分配的标识类型。

    - 逻辑应用资源可以同时拥有多个用户分配的标识。

    - 可以在逻辑应用资源级别和连接级别使用标识。

若要了解更多 Azure 逻辑应用中的托管标识限制,请参阅逻辑应用的托管标识限制。 有关“消耗”和“标准”逻辑应用资源类型和环境的详细信息,请查看以下文档:

可以使用托管标识的操作

只有支持 Azure AD 开放身份验证 (Azure AD OAuth) 的特定内置和托管连接器操作才能使用托管标识进行身份验证。 下表提供的仅为示例选择。 有关更完整的列表,请参阅支持身份验证的触发器和操作的身份验证类型支持通过托管标识进行 Azure AD 身份验证的 Azure 服务

下表列出了可在“逻辑应用(消耗)”资源类型中使用系统分配的托管标识或用户分配的托管标识的操作:

操作类型 支持的操作
内置 - Azure API 管理
- Azure 应用服务
- Azure Functions
- HTTP
- HTTP + Webhook

注意:HTTP 操作可使用系统分配的标识验证与 Azure 防火墙后面的 Azure 存储帐户的连接。 但是,它们不能使用用户分配的托管标识来验证上述连接。

托管连接器(预览版) 单一身份验证:
- Azure 自动化
- Azure 事件网格
- Azure 密钥保管库
- Azure 资源管理器
- 使用 Azure AD 的 HTTP

多种身份验证:
- Azure Blob 存储
- SQL Server

本文说明如何根据使用的资源类型(“逻辑应用(消耗)”或“逻辑应用(标准)”)来启用和设置系统分配的标识或用户分配的标识 。 不同于无需手动创建的系统分配的标识,用户分配的标识必须手动创建。 本文包含使用 Azure 门户和 Azure 资源管理器模板(ARM 模板)创建用户分配的标识的步骤。 若使用 Azure PowerShell、Azure CLI 和 Azure REST API,请参阅以下文档:

工具 文档
Azure PowerShell 创建用户分配的标识
Azure CLI 创建用户分配的标识
Azure REST API 创建用户分配的标识

先决条件

  • Azure 帐户和订阅。 如果没有订阅,请注册试用版 Azure 订阅。 托管标识和需要访问的目标 Azure 资源必须使用相同的 Azure 订阅。

  • 若要为托管标识提供对 Azure 资源的访问权限,需要为该标识向目标资源添加一个角色。 若要添加角色,你需要 Azure AD 管理员权限,可以将角色分配给相应的 Azure AD 租户中的标识。

  • 要访问的目标 Azure 资源。 在此资源上,你将为托管标识添加一个角色,该角色可帮助逻辑应用资源或连接验证对目标资源的访问。

  • 要在其中使用支持托管标识的触发器或操作的逻辑应用资源。

在 Azure 门户中启用系统分配的标识

  1. Azure 门户中,打开你的逻辑应用资源。

  2. 在逻辑应用菜单的“设置”下,选择“标识” 。

  3. 在“标识”窗格的“系统分配”下,选择“打开”>“保存” 。 当 Azure 提示你进行确认时,选择“是”。

    Screenshot showing Azure portal with Consumption logic app's

    注意

    如果收到一个错误,指出你只能有一个托管标识,则表明逻辑应用资源已与用户分配的标识相关联。 在添加系统分配的标识之前,必须先从逻辑应用中删除用户分配的标识。

    逻辑应用资源现在可以使用系统分配的标识。 此标识注册到 Azure AD,采用对象 ID 表示。

    Screenshot showing Consumption logic app's

    属性 说明
    对象(主体) ID <identity-resource-ID> 全局唯一标识符 (GUID),表示 Azure AD 租户中逻辑应用的系统分配的标识。
  4. 现在,按照本主题后面的授予该标识对资源的访问权限的步骤进行操作。

在 ARM 模板中启用系统分配的标识

若要自动创建和部署 Azure 资源(如逻辑应用),可以使用 ARM 模板。 若要在模板中为逻辑应用资源启用系统分配的托管标识,请在模板中将 identity 对象和 type 子属性添加到逻辑应用的资源定义中,例如:

{
   "apiVersion": "2016-06-01",
   "type": "Microsoft.logic/workflows",
   "name": "[variables('logicappName')]",
   "location": "[resourceGroup().location]",
   "identity": {
      "type": "SystemAssigned"
   },
   "properties": {},
   <...>
}

当 Azure 创建逻辑应用资源定义时,identity 对象将获取其他属性:

"identity": {
   "type": "SystemAssigned",
   "principalId": "<principal-ID>",
   "tenantId": "<Azure-AD-tenant-ID>"
}
属性 (JSON) 说明
principalId <principal-ID> 托管标识的服务主体对象的全局唯一标识符 (GUID),表示 Azure AD 租户中的逻辑应用。 此 GUID 有时显示为“对象 ID”或 objectID
tenantId <Azure-AD-tenant-ID> 全局唯一标识符 (GUID),表示逻辑应用现在是其中的一名成员的 Azure AD 租户。 在 Azure AD 租户内,服务主体与逻辑应用实例具有相同名称。

在 Azure 门户中创建用户分配的标识

在“逻辑应用(消耗)”或“逻辑应用(标准)”资源上启用用户分配的标识之前,必须先将该标识创建为独立 Azure 资源。

  1. Azure 门户的搜索框中,输入 managed identities。 选择“托管标识”。

    Screenshot showing Azure portal with

  2. 在“托管标识”窗格上选择“创建” 。

    Screenshot showing

  3. 提供有关托管标识的信息,然后选择“查看 + 创建”,例如:

    Screenshot showing

    属性 必须 说明
    订阅 <Azure-subscription-name> 要使用的 Azure 订阅的名称
    资源组 <Azure-resource-group-name> 要使用的 Azure 资源组的名称。 创建新组或选择现有组。 此示例创建一个名为 fabrikam-managed-identities-RG 的新资源组。
    区域 <Azure-region> 用于存储有关资源的信息的 Azure 区域。 此示例使用“中国东部 2”。
    名称 <user-assigned-identity-name> 赋予用户分配的标识的名称。 本示例使用 Fabrikam-user-assigned-identity

    Azure 验证信息后会创建托管标识。 现在,可以将用户分配的标识添加到逻辑应用资源中。

将用户分配的标识添加到 Azure 门户的逻辑应用中

  1. 在 Azure 门户中,打开你的逻辑应用资源。

  2. 在逻辑应用菜单的“设置”下,选择“标识” 。

  3. 在“标识”窗格上,选择“用户分配”>“添加” 。

    Screenshot showing Consumption logic app and

  4. 在“添加用户分配的托管标识”窗格上,请执行以下步骤:

    1. 在“订阅”列表中,选择你的 Azure 订阅(如果尚未选择)。

    2. 从该订阅中所有托管标识的列表中,选择所需的用户分配的标识。 若要筛选列表,请在“用户分配的托管标识”搜索框中输入标识或资源组的名称。

      Screenshot showing Consumption logic app and the user-assigned identity selected.

    3. 完成后,选择“添加”。

      注意

      如果你收到一个错误,指出你只能有一个托管标识,则表明逻辑应用已与系统分配的标识相关联。 在添加用户分配的标识之前,必须先禁用系统分配的标识。

    逻辑应用现已与用户分配的托管标识相关联。

    Screenshot showing Consumption logic app and association between user-assigned identity and logic app resource.

  5. 现在,按照本主题后面的授予该标识对资源的访问权限的步骤进行操作。

在 ARM 模板中创建用户分配的标识

若要自动创建和部署 Azure 资源(如逻辑应用),可以使用 ARM 模板,该模板支持使用用户分配的标识进行身份验证

在模板的 resources 部分中,逻辑应用的资源定义需要以下各项:

  • 一个 type 属性设置为 UserAssignedidentity 对象

  • 一个子 userAssignedIdentities 对象,该对象指定用户分配的资源和名称

本例介绍了 HTTP PUT 请求的消耗逻辑应用资源定义,并包含非参数化的 identity 对象。 对 PUT 请求和后续 GET 操作的响应还具有此 identity 对象:

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {<template-parameters>},
   "resources": [
      {
         "apiVersion": "2016-06-01",
         "type": "Microsoft.logic/workflows",
         "name": "[variables('logicappName')]",
         "location": "[resourceGroup().location]",
         "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
               "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name>": {}
            }
         },
         "properties": {
            "definition": {<logic-app-workflow-definition>}
         },
         "parameters": {},
         "dependsOn": []
      },
   ],
   "outputs": {}
}

如果模板还包括托管标识的资源定义,则可以将 identity 对象参数化。 此示例演示子 userAssignedIdentities 对象如何引用你在模板的 variables 部分中定义的 userAssignedIdentityName 变量。 此变量引用用户分配的标识的资源 ID。

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      "Template_LogicAppName": {
         "type": "string"
      },
      "Template_UserAssignedIdentityName": {
         "type": "securestring"
      }
   },
   "variables": {
      "logicAppName": "[parameters(`Template_LogicAppName')]",
      "userAssignedIdentityName": "[parameters('Template_UserAssignedIdentityName')]"
   },
   "resources": [
      {
         "apiVersion": "2016-06-01",
         "type": "Microsoft.logic/workflows",
         "name": "[variables('logicAppName')]",
         "location": "[resourceGroup().location]",
         "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
               "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', variables('userAssignedIdentityName'))]": {}
            }
         },
         "properties": {
            "definition": {<logic-app-workflow-definition>}
         },
         "parameters": {},
         "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', variables('userAssignedIdentityName'))]"
         ]
      },
      {
         "apiVersion": "2018-11-30",
         "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
         "name": "[parameters('Template_UserAssignedIdentityName')]",
         "location": "[resourceGroup().location]",
         "properties": {}
      }
  ]
}

授予标识对资源的访问权限

在可以使用逻辑应用的托管标识进行身份验证之前,必须针对需使用标识的 Azure 资源上的标识设置访问权限。 设置访问权限的方式取决于你想要标识访问的资源类型。

注意

当托管标识有权访问同一订阅中的 Azure 资源时,该标识只能访问该资源。 但是,在某些支持托管标识的触发器和操作中,你必须首先选择包含目标资源的 Azure 资源组。 如果标识在资源组级别没有访问权限,即使有权访问目标资源,该组中也不会列出任何资源。

若要处理此行为,还必须向标识授予对资源组的访问权限,而不只是对资源的访问权限。 同样,如果必须先选择订阅,然后才能选择目标资源,你必须向标识授予对订阅的访问权限。

例如,若要使用托管标识访问 Azure Blob 存储帐户,则必须使用 Azure 基于角色的访问控制 (Azure RBAC) 设置访问权限,并将该标识的相应角色分配给存储帐户。 本部分中的步骤介绍如何使用 Azure 门户Azure 资源管理器模板(ARM 模板)完成此任务。 若使用 Azure PowerShell、Azure CLI 和 Azure REST API,请参阅以下文档:

工具 文档
Azure PowerShell 添加角色分配
Azure CLI 添加角色分配
Azure REST API 添加角色分配

但是,若要使用托管标识访问 Azure 密钥保管库,你必须在密钥保管库上为此标识创建访问策略,并为此密钥保管库上的该标识分配相应权限。 本部分的后续步骤介绍如何使用 Azure 门户完成此任务。 有关资源管理器模板、PowerShell 和 Azure CLI,请查看以下文档:

工具 文档
Azure 资源管理器模板(ARM 模板) Key Vault 访问策略资源定义
Azure PowerShell 分配 Key Vault 访问策略
Azure CLI 分配 Key Vault 访问策略

在 Azure 门户中分配基于托管标识角色的访问权限

若要使用托管标识进行身份验证,某些 Azure 资源(如 Azure 存储帐户)要求将标识分配给对目标资源具有相应权限的角色。 其他 Azure 资源(如 Azure 密钥保管库)则要求创建对该标识的目标资源具有相应权限的访问策略

  1. Azure 门户中,打开要使用标识的资源。

  2. 从该资源的菜单中,选择“访问控制(IAM)”>“添加”>“添加角色分配”。

    注意

    如果已禁用“添加角色分配”选项,那么你没有权限分配角色。 有关详细信息,请查看 Azure AD 内置角色

  3. 现在,向托管标识分配必要的角色。 在“角色”选项卡上,分配一个角色,该角色将为标识提供访问当前资源所需的权限。

    在本示例中,请分配名为“存储 Blob 数据参与者”的角色,该角色包含对 Azure 存储容器中 blob 的写入访问权限。 有关特定存储容器角色的详细信息,请查看可以访问 Azure 存储容器中的 blob 的角色

  4. 接下来,选择要分配角色的托管标识。 在“将访问权限分配到”下,选择“托管标识”>“添加成员”。

  5. 根据托管标识的类型,选择或提供以下值:

    类型 Azure 服务实例 订阅 成员
    系统分配 逻辑应用 <Azure-subscription-name> <your-logic-app-name>
    用户分配 不适用 <Azure-subscription-name> <your-user-assigned-identity-name>

    有关如何分配角色的详细信息,请查看文档使用 Azure 门户分配角色

  6. 完成后,可以使用此标识对支持托管标识的触发器和操作的访问权限进行身份验证

    有关此任务的更多常规信息,请查看使用 Azure RBAC 授予托管标识对另一资源的访问权限

在 Azure 门户中创建访问策略

若要使用托管标识进行身份验证,某些 Azure 资源(如 Azure 密钥保管库)需要创建对该标识的目标资源具有相应权限的访问策略。 其他 Azure 资源(如 Azure 存储帐户)要求将标识分配给对目标资源具有相应权限的角色

  1. Azure 门户中,打开需要使用标识的目标资源。 本例使用 Azure 密钥保管库作为目标资源。

  2. 在资源的菜单中,选择“访问策略>创建”,这将打开“创建访问策略”窗格。

    注意

    如果资源没有“访问策略”选项,请尝试改为分配“角色分配”

    Screenshot showing the Azure portal and key vault example with

  3. 在“权限”选项卡上,选择标识访问目标资源所需的权限。

    例如,若要将标识与托管 Azure Key Vault 连接器的“列出机密”操作一起使用,则标识需要“列表”的访问权限。 因此,在“机密权限”列中,选择“列表”。

    Screenshot showing

  4. 准备就绪后,选择“下一步”。 在“主体”选项卡上,找到并选择托管标识,该标识是本例中用户分配的标识。

  5. 跳过可选的“应用程序”步骤,选择“下一步”,然后完成创建访问策略。

下一部分将介绍如何使用托管标识对触发器或操作的访问权限进行身份验证,本例将继续执行前文使用 RBAC 为托管标识设置访问权限的步骤,不使用 Azure Key Vault 作为示例。 但是,使用托管标识进行身份验证的一般步骤都相同。

使用托管标识对访问权限进行身份验证

为逻辑应用资源启用托管标识授予该标识对目标资源或实体的访问权限后,可以在支持托管标识的触发器和操作中使用该标识。

重要

如果你有想要使用系统分配的标识的 Azure 函数,首先为 Azure 函数启用身份验证

以下步骤演示了如何通过 Azure 门户将托管标识与触发器或操作一起使用。 若要在触发器或操作的基础 JSON 定义中指定托管标识,请参阅托管标识身份验证

  1. Azure 门户中,打开你的逻辑应用资源。

  2. 如果尚未这样做,请添加支持托管标识的触发器或操作

    注意

    并非所有触发器和操作支持都允许你添加身份验证类型。 有关详细信息,请参阅支持身份验证的触发器和操作的身份验证类型

  3. 在添加的触发器或操作上,执行以下步骤:

    • 支持托管标识身份验证的内置操作

      1. 如果“身份验证”属性尚未出现,则在“添加新参数”列表中添加该属性 。

        Screenshot showing example built-in action with

      2. 从“身份验证类型”列表选择“托管标识” 。

        Screenshot showing example built-in action with

      有关详细信息,请参阅示例:使用托管标识对内置触发器或操作进行身份验证

    • 支持托管标识身份验证的托管连接器操作(预览)

      1. 在租户选择页上,选择“使用托管标识进行连接(预览)”,例如:

        Screenshot showing Azure Resource Manager action and

      2. 在下一页的“连接名称”处,提供连接的名称。

      3. 对于身份验证类型,根据托管连接器选择下列选项之一:

        • 单一身份验证:这些连接器仅支持一种身份验证类型。 在“托管标识”列表中,选择当前启用的托管标识(如果尚未选择),然后选择“创建”,例如 :

          Screenshot showing the connection name page and single managed identity selected in Consumption.

        • 多种身份验证:这些连接器支持多种身份验证类型。 从“身份验证类型”列表选择“逻辑应用托管标识”>“创建”,例如 :

          Screenshot showing the connection name page and

        有关详细信息,请参阅示例:使用托管标识对托管连接器触发器或操作进行身份验证

示例:使用托管标识对内置触发器或操作进行身份验证

内置 HTTP 触发器或操作可使用你在逻辑应用资源上启用的系统分配的标识。 通常,HTTP 触发器或操作使用以下属性来指定要访问的资源或实体:

属性 必须 说明
方法 要运行的操作所使用的 HTTP 方法
URI 用于访问目标 Azure 资源或实体的终结点 URL。 URI 语法通常包含 Azure 资源或服务的资源 ID
标头 需要包含在传出请求中的任何标头值,如内容类型
查询 需要包含在请求中的任何查询参数,如特定操作的参数或要运行的操作的 API 版本
身份验证 用于对目标资源或实体的访问进行身份验证的身份验证类型

作为特定示例,假设要在之前为标识设置访问权限的 Azure 存储帐户中的 Blob 上运行快照 Blob 操作。 但是,Azure Blob 存储连接器当前不提供此操作。 相反,你可以使用 HTTP 操作或另一个 Blob 服务 REST API 操作来运行此操作。

重要

若要使用 HTTP 请求和托管标识访问防火墙后面的 Azure 存储帐户,请确保同时在存储帐户中设置允许受信任 Azure 服务进行访问的例外项

若要运行快照 Blob 操作,HTTP 操作将指定以下属性:

properties 必选 示例值 说明
方法 PUT 快照 Blob 操作使用的 HTTP 方法
URI https://<storage-account-name>/<folder-name>/{name} Azure 全球(公共)环境中使用此语法的 Azure Blob 存储文件的资源 ID
标头 对于 Azure 存储 x-ms-blob-type = BlockBlob

x-ms-version = 2019-02-02

x-ms-date = @{formatDateTime(utcNow(),'r')}

Azure 存储操作需要 x-ms-blob-typex-ms-versionx-ms-date 标头值。

重要说明:在 Azure 存储的传出 HTTP 触发器和操作请求中,标头需要 x-ms-version 属性以及要运行的操作的 API 版本。 x-ms-date 必须为当前日期。 否则,工作流将失败并显示 403 FORBIDDEN 错误。 若要获取所需格式的当前日期,可以在示例值中使用表达式。

有关详细信息,请查看以下主题:

- 请求标头 - 快照 Blob
- Azure 存储服务的版本控制

查询 仅适用于快照 Blob 操作 comp = snapshot 操作的查询参数名称和值。

以下示例演示了一个示例 HTTP 操作,其中包含用于快照 Blob 操作的所有先前描述的属性值:

Screenshot showing Azure portal with Consumption logic app workflow and HTTP action set up to access resource.

  1. 添加 HTTP 操作后,将“身份验证”属性添加到 HTTP 操作。 在“添加新参数”列表中,选择“身份验证”。

    Screenshot showing Consumption workflow with HTTP action and

    注意

    并非所有触发器和操作支持都允许你添加身份验证类型。 有关详细信息,请参阅支持身份验证的触发器和操作的身份验证类型

  2. 从“身份验证类型”列表选择“托管标识” 。

    Screenshot showing Consumption workflow with HTTP action and

  3. 从“托管标识”列表中,根据你的方案从可用选项中进行选择。

    • 如果设置系统分配的标识,请选择“系统分配的托管标识”(如果尚未选择)。

      Screenshot showing Consumption workflow with HTTP action and

    • 如果设置了用户分配的标识,请选择该标识(如果尚未选择)。

      Screenshot showing Consumption workflow with HTTP action and

    此示例将继续处理“系统分配的托管标识”。

  4. 在某些触发器和操作上,还会显示“受众”属性,以便设置目标资源 ID。 将“受众”属性设置为目标资源或服务的资源 ID。 否则,默认情况下,“受众”属性使用 https://management.chinacloudapi.cn/ 资源 ID,该 ID 是 Azure 资源管理器的资源 ID。

    例如,如果要验证对全球 Azure 云中的 Key Vault 资源的访问权限,必须将“受众”属性准确地设置为以下资源 ID:https://vault.azure.cn。 请注意,此特定资源 ID 没有任何尾部斜杠。 事实上,包含尾部斜杠可能会生成 400 Bad Request 错误或 401 Unauthorized 错误。

    重要

    请确保此目标资源 ID 完全匹配 Azure Active Directory (AD) 所需的值,包括任何必需的尾部反斜杠。 例如,所有 Azure Blob 存储帐户的资源 ID 都需要尾部反斜杠。 但是,特定存储帐户的资源 ID 不需要尾部反斜杠。 检查支持 Azure AD 的 Azure 服务的资源 ID

    此示例将“受众”属性设置为 https://storage.azure.com/,以便用于身份验证的访问令牌对所有存储帐户都有效。 但是,还可以为特定存储帐户指定根服务 URL https://<your-storage-account>.blob.core.chinacloudapi.cn

    Screenshot showing Consumption workflow with HTTP action and

    有关使用 Azure AD 为 Azure 存储授予访问权限的详细信息,请参阅以下文档:

  5. 继续按照所需方式生成工作流。

示例:使用托管标识对托管连接器触发器或操作进行身份验证

Azure 资源管理器托管连接器的操作“读取资源”可使用在逻辑应用资源上启用的托管标识。 此示例显示如何使用系统分配的托管标识。

  1. 在将操作添加到工作流并选择了 Azure AD 租户后,请选择“使用托管标识进行连接(预览)”。

    Screenshot showing Azure Resource Manager action and

  2. 在连接名称页上,提供连接的名称,然后选择要使用的托管标识。

    Azure 资源管理器操作是单一身份验证操作,因此连接信息窗格会显示一个“托管标识”列表,该列表自动选择当前在逻辑应用资源上启用的托管标识。 如果你启用了系统分配的托管标识,“托管标识”列表将选择“系统分配的托管标识” 。 如果你启用了用户分配的托管标识,列表将改为选择该标识。

    如果使用的是多种身份验证触发器或操作(例如 Azure Blob 存储),连接信息窗格会显示一个“身份验证类型”列表,其中包括“逻辑应用托管标识”选项和其他身份验证类型 。

    在本例中,“系统分配的托管标识”是唯一可用的选择。

    Screenshot showing Azure Resource Manager action with the connection name entered and

    注意

    如果在尝试创建连接、更改连接时未启用托管标识,或在已启用托管标识的连接仍然存在时删除了托管标识,你会遇到一个错误,指出你必须启用标识并授予对目标资源的访问权限。

  3. 准备就绪后,选择“创建”。

  4. 设计器成功创建连接后,设计器可使用托管标识身份验证获取任何动态值、内容或架构。

  5. 继续按照所需方式生成工作流。

逻辑应用资源定义和使用托管标识的连接

启用和使用托管标识的连接是一种特殊的连接类型,仅适用于托管标识。 在运行时,该连接使用逻辑应用资源上启用的托管标识。 在运行时,Azure 逻辑应用服务会检查逻辑应用工作流中是否有任何托管连接器触发器和操作被设置为使用托管标识,以及是否已将所有所需权限设置为使用托管标识来访问由触发器和操作指定的目标资源。 如果成功,Azure 逻辑应用将检索与托管标识关联的 Azure AD 令牌,使用该标识验证对目标资源的访问,并在触发器和操作中执行配置的操作。

在“逻辑应用(消耗)”资源中,连接配置保存在逻辑应用资源定义的 parameters 对象中,该对象包含 $connections 对象,后者包含指向连接的资源 ID 以及标识的资源 ID 的指针(如果已启用用户分配的标识)。

本例展示了逻辑应用启用系统分配的托管标识时的配置情况:

"parameters": {
   "$connections": {
      "value": {
         "<action-name>": {
            "connectionId": "/subscriptions/{Azure-subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/connections/{connection-name}",
            "connectionName": "{connection-name}",
            "connectionProperties": {
               "authentication": {
                  "type": "ManagedServiceIdentity"
               }
            },
            "id": "/subscriptions/{Azure-subscription-ID}/providers/Microsoft.Web/locations/{Azure-region}/managedApis/{managed-connector-type}"
         }
      }
   }
}

本例展示了逻辑应用启用了用户分配的托管标识时的配置:

"parameters": {
   "$connections": {
      "value": {
         "<action-name>": {
            "connectionId": "/subscriptions/{Azure-subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/connections/{connection-name}",
            "connectionName": "{connection-name}",
            "connectionProperties": {
               "authentication": {
                  "type": "ManagedServiceIdentity",
                  "identity": "/subscriptions/{Azure-subscription-ID}/resourceGroups/{resourceGroupName}/providers/microsoft.managedidentity/userassignedidentities/{managed-identity-name}"
               }
            },
            "id": "/subscriptions/{Azure-subscription-ID}/providers/Microsoft.Web/locations/{Azure-region}/managedApis/{managed-connector-type}"
         }
      }
   }
}

用于 API 连接和托管标识的 ARM 模板

如果你使用 ARM 模板自动执行部署,并且工作流内包含 API 连接,该连接由使用托管标识的托管连接器(如 Office 365 Outlook、Azure Key Vault 等)创建,因此你需要执行额外的步骤。

在此方案中,检查基础连接资源定义是否包含 parameterValueSet 对象,该对象内包括设置为 managedIdentityAuthname 属性以及设置为空对象的 values 属性。 否则,ARM 部署不会设置连接来将托管标识用于身份验证,并且该连接在工作流中不起作用。 此要求仅适用于选择了“通过托管标识连接”选项特定托管连接器触发器和操作

例如,下面是使用托管标识的消耗逻辑应用资源中 Azure 自动化操作的基础连接资源定义,该定义包括 parameterValueSet 对象,该对象的 name 属性设置为 managedIdentityAuth 并且 values 属性设置为空对象。 另请注意,apiVersion 属性设置为 2018-07-01-preview

{
    "type": "Microsoft.Web/connections",
    "name": "[variables('automationAccountApiConnectionName')]",
    "apiVersion": "2018-07-01-preview",
    "location": "[parameters('location')]",
    "kind": "V1",
    "properties": {
        "api": {
            "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureautomation')]"
        },
        "customParameterValues": {},
        "displayName": "[variables('automationAccountApiConnectionName')]",
        "parameterValueSet":{
            "name": "managedIdentityAuth",
            "values": {}
    }
},

设置对 API 连接身份验证的高级控制

当工作流使用由托管连接器(如 Office 365 Outlook、Azure Key Vault 等)创建的 API 连接时,Azure 逻辑应用服务会使用两个连接与目标资源(如电子邮件帐户、密钥保管库等)通信:

Conceptual diagram showing first connection with authentication between logic app and token store plus second connection between token store and target resource.

  • 连接 #1 使用内部令牌存储的身份验证进行设置。

  • 连接 #2 使用目标资源的身份验证进行设置。

在消耗逻辑应用资源中,无需设置任何配置选项,即可提取连接 #1。 在标准逻辑应用资源类型中,你可以更好地控制逻辑应用。 默认情况下,连接 #1 会自动设置为使用系统分配的标识。

但是,如果方案需要对 API 连接进行身份验证以实现更精准的控制,你也可以修改连接 #1 的身份验证,将默认的系统分配的标识更改为已添加到逻辑应用的任何用户分配的标识。 此身份验证适用于每个 API 连接,因此,可以将系统分配的标识和用户分配的标识混合应用到同一目标资源的不同连接。

在存储每个 API 连接相关信息的标准逻辑应用 connections.json 文件中,每个连接定义都有两个 authentication 部分,例如:

"keyvault": {
   "api": {
      "id": "/subscriptions/{Azure-subscription-ID}/providers/Microsoft.Web/locations/{region}/managedApis/keyvault"
   },
   "authentication": {
      "type": "ManagedServiceIdentity",
   },
   "connection": {
      "id": "/subscriptions/{Azure-subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/connections/<connection-name>"
   },
   "connectionProperties": {
      "authentication": {
         "audience": "https://vault.azure.cn",
         "type": "ManagedServiceIdentity"
      }
   },
   "connectionRuntimeUrl": "<connection-runtime-URL>"
}
  • 映射到连接 #1,第一部分 authentication 是指用于与内部令牌存储通信的身份验证。 在过去,对于部署到 Azure 且没有可配置选项的应用,此部分始终设置为 ManagedServiceIdentity

  • 映射到连接 #2,第二部分 authentication 是指用于与目标资源通信的身份验证可能会因你为此连接选择的身份验证类型而异。

为什么需要更改令牌存储的身份验证?

在某些方案中,你可能想要在多个逻辑应用之间共享使用同一 API 连接,但不想将每个逻辑应用的系统分配的标识添加到目标资源的访问策略中。

在其他方案中,你可能不希望为整个逻辑应用设置系统分配的标识,因此可以将身份验证更改为用户分配的标识,并完全禁用系统分配的标识。

更改令牌存储的身份验证

  1. Azure 门户中,打开你的标准逻辑应用资源。

  2. 在资源菜单的“工作流”下,选择“连接”。

  3. 在“连接”窗格中,选择“JSON 视图”。

    Screenshot showing the Azure portal, Standard logic app resource,

  4. 在 JSON 编辑器中,找到 managedApiConnections 部分,其中包含逻辑应用资源中所有工作流的 API 连接。

  5. 查找要添加用户分配的托管标识的连接。 例如,假设工作流具有 Azure Key Vault 连接:

    "keyvault": {
       "api": {
          "id": "/subscriptions/{Azure-subscription-ID}/providers/Microsoft.Web/locations/{region}/managedApis/keyvault"
       },
       "authentication": {
          "type": "ManagedServiceIdentity"
       },
       "connection": {
          "id": "/subscriptions/{Azure-subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/connections/<connection-name>"
       },
       "connectionProperties": {
          "authentication": {
             "audience": "https://vault.azure.cn",
             "type": "ManagedServiceIdentity"
          }
       },
       "connectionRuntimeUrl": "<connection-runtime-URL>"
    }
    
  6. 在连接定义中,执行以下步骤:

    1. 找到第一部分 authentication。 如果本部分 authentication 中没有 identity 属性,逻辑应用将隐式使用系统分配的标识。

    2. 根据此步骤中的示例添加 identity 属性。

    3. 将属性值设置为用户分配的标识的资源 ID。

    "keyvault": {
       "api": {
          "id": "/subscriptions/{Azure-subscription-ID}/providers/Microsoft.Web/locations/{region}/managedApis/keyvault"
       },
       "authentication": {
          "type": "ManagedServiceIdentity",
          // Add "identity" property here
          "identity": "/subscriptions/{Azure-subscription-ID}/resourcegroups/{resource-group-name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identity-resource-ID}" 
       },
       "connection": {
          "id": "/subscriptions/{Azure-subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/connections/<connection-name>"
       },
       "connectionProperties": {
          "authentication": {
             "audience": "https://vault.azure.cn",
             "type": "ManagedServiceIdentity"
          }
       },
       "connectionRuntimeUrl": "<connection-runtime-URL>"
    }
    
  7. 在 Azure 门户中,转到目标资源,并根据目标资源的需求授予用户分配的托管标识的访问权限

    例如,对于 Azure Key Vault,将标识添加到密钥保管库的访问策略中。 对于 Azure Blob 存储,将标识的必要角色分配给存储帐户。

禁用托管标识

若要停止使用托管标识进行身份验证,请先删除标识对目标资源的访问权限。 接下来,在逻辑应用资源上关闭系统分配的标识或删除用户分配的标识

在逻辑应用资源上禁用托管标识时,删除该标识请求访问该标识有权访问的 Azure 资源的功能。

注意

如果禁用系统分配的标识,即使立即再次启用该标识,该逻辑应用工作流中由工作流使用的任何连接在运行时都无法正常工作。 发生此行为的原因是禁用标识会删除对象 ID。 在你每次启用标识时,Azure 都会生成具有一个不同且唯一的对象 ID 的标识。 若要解决此问题,你必须重新创建连接,以便它们使用当前系统分配的标识的当前对象 ID。

尽量避免禁用系统分配的标识。 如果要删除标识对 Azure 资源的访问权限,请从目标资源中删除标识的角色分配。 如果删除逻辑应用资源,Azure 将从 Azure AD 中自动删除托管标识。

本部分中的步骤包含使用 Azure 门户Azure 资源管理器模板(ARM 模板)的情况。 若使用 Azure PowerShell、Azure CLI 和 Azure REST API,请参阅以下文档:

工具 文档
Azure PowerShell 1. 删除角色分配
2. 删除用户分配的标识
Azure CLI 1. 删除角色分配
2. 删除用户分配的标识
Azure REST API 1. 删除角色分配
2. 删除用户分配的标识

在 Azure 门户中禁用托管标识

若要删除托管标识的访问权限,请从目标资源中删除标识的角色分配,然后禁用托管标识。

删除角色分配

以下步骤从托管标识中删除对目标资源的访问权限:

  1. Azure 门户中,转到你要在其中删除托管标识的访问权限的目标 Azure 资源。

  2. 从目标资源的菜单中,选择“访问控制 (IAM)”。 在工具栏下,选择“角色分配”。

  3. 在“角色”列表中,选择要删除的托管标识。 在工具栏上,选择“删除”。

    提示

    如果“删除”选项处于禁用状态,那么你很可能没有权限。 有关可用于管理资源角色的权限的详细信息,请参阅 Azure Active Directory 中的管理员角色权限

在逻辑应用资源上禁用托管标识

  1. Azure 门户中,打开你的逻辑应用资源。

  2. 在逻辑应用导航菜单上的“设置”下选择“标识”,然后按照标识的步骤进行操作 :

    • 选择“系统分配”>“开启”>“保存”。 当 Azure 提示你进行确认时,选择“是”。

    • 选择“用户分配”和托管标识,然后选择“删除”。 当 Azure 提示你进行确认时,选择“是”。

在 ARM 模板中禁用托管标识

如果使用 ARM 模板创建了逻辑应用的托管标识,请将 identity 对象的 type 子属性设置为 None

"identity": {
   "type": "None"
}

后续步骤