将事件传送到 Microsoft Entra 受保护的端点

本文介绍如何使用Microsoft Entra ID身份验证保护从 Azure 事件网格(事件订阅)到 Webhook 终结点的事件传送。 了解如何配置Microsoft Entra应用程序并分配相应的角色,以便在事件网格和 Webhook 之间建立经过身份验证的连接。 本文使用 Azure 门户进行演示。 但是,还可以使用 CLI、PowerShell 或 SDK 启用该功能。

重要

为了解决安全漏洞,Microsoft在 2021 年 3 月 30 日创建或更新事件订阅时引入了额外的访问检查。 订阅客户端的服务主体需要是所有者或已在目标应用程序服务主体中被分配有角色。 按照本文中的新说明重新配置Microsoft Entra应用程序。 有关Microsoft Entra应用程序和服务主体的概述,请参阅 Microsoft 标识平台 (v2.0) 概述

场景

本文详细介绍了如何实现以下两种方案:

将事件发送到同一 Microsoft Entra 租户中的 Webhook

下图显示了事件网格如何向与事件订阅在同一租户中的 Webhook 传递事件。

展示如何将事件安全传送到同一租户中的 Webhook 的图像。

本部分有两个子节。 阅读这两种方案或你感兴趣的方案。

使用Microsoft Entra用户配置事件订阅

本部分演示如何使用Microsoft Entra用户配置事件订阅。

  1. 为与 Microsoft Entra(单租户)配置的 Webhook 创建 Microsoft Entra 应用程序。

  2. 打开 PowerShell 环境。

  3. 修改 $webhookAadTenantId 的值以连接到该租户。

    • 变量:
      • $webhookAadTenantId:Azure租户 ID
    $webhookAadTenantId = "[REPLACE_WITH_YOUR_TENANT_ID]"
    Connect-MgGraph -TenantId $webhookAadTenantId -Scopes "Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All"
    
  4. 打开以下脚本,并使用你的标识符更新 $webhookAppObjectId 和$eventSubscriptionWriterUserPrincipalName 的值,然后继续运行该脚本 。

    • 变量:
      • $webhookAppObjectId:为 Webhook 创建的Microsoft Entra应用程序 ID
      • $eventSubscriptionWriterUserPrincipalName:创建事件订阅的用户Azure用户主体名称

    注意

    无需修改 $eventGridAppId 的值。 在此脚本中会为 $eventGridRoleName 设置 AzureEventGridSecureWebhookSubscriber。 请记住,必须是 Microsoft Entra 应用程序管理员角色的成员或成为 Microsoft Entra ID 中 Webhook 应用服务主体的所有者才能执行此脚本。

    如果看到以下错误消息,则需要提升权限到服务主体。 2021 年 3 月 30 日,我们在事件订阅的创建或更新中引入了附加访问检查,以解决安全漏洞。 订阅客户端的服务主体需要是所有者之一或在目标应用程序服务主体中分配了角色。

    New-MgServicePrincipalAppRoleAssignment: Error occurred while executing NewServicePrincipalAppRoleAssignment
    Code: Authorization_RequestDenied
    Message: Insufficient privileges to complete the operation.
    
  5. 在门户中创建事件订阅时,请执行以下步骤:

    1. 选择“Web Hook”作为终结点类型。

    2. 指定终结点 URI。

      在 Azure 门户中选择终结点类型 Webhook 的屏幕截图。

    3. 选择“创建事件订阅”页顶部的“其他功能”选项卡 。

    4. 在“其他功能”选项卡上,执行以下步骤:

      1. 选择 使用Microsoft Entra身份验证,然后配置租户 ID 和应用程序 ID:

      2. 从脚本的输出中复制Microsoft Entra租户 ID,并在Microsoft Entra租户 ID 字段中输入该 ID。

      3. 从脚本的输出中复制Microsoft Entra应用程序 ID,并将其输入到 Microsoft Entra 应用程序 ID 字段中。 可以使用Microsoft Entra应用程序 ID URI 来替代应用程序 ID。 有关应用程序 ID URI 的详细信息,请参阅本文

        在 Azure 门户中安全 Webhook 操作配置的截图。

使用 Microsoft Entra 应用程序配置事件订阅

本部分演示如何使用 Microsoft Entra 应用程序配置事件订阅。

  1. 为配置为与 Microsoft Entra(单租户)协作的事件网格订阅编写器创建 Microsoft Entra 应用程序。

  2. 为Microsoft Entra应用程序创建机密并保存该值(稍后需要此值)。

  3. 转到 Event Grid 主题的“访问控制(IAM)”页,并将“Event Grid 参与者”角色分配给 Event Grid 订阅写入应用。 此步骤允许您通过使用Azure CLI与Microsoft Entra应用程序登录Azure来访问事件网格资源。

  4. 为配置为在 Microsoft Entra(单租户)中使用的 Webhook 创建一个 Microsoft Entra 应用程序。

  5. 打开 PowerShell 环境。

  6. 修改 $webhookAadTenantId 的值以连接到该租户。

    • 变量:
      • $webhookAadTenantId:Azure租户 ID
    $webhookAadTenantId = "[REPLACE_WITH_YOUR_TENANT_ID]"
    Connect-MgGraph -TenantId $webhookAadTenantId -Scopes "Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All"
    
  7. 打开以下脚本,并使用你的标识符更新 $webhookAppObjectId 和$eventSubscriptionWriterAppId 的值,然后继续运行该脚本 。

    • 变量:
      • $webhookAppObjectId:为 Webhook 创建的Microsoft Entra应用程序 ID
      • $eventSubscriptionWriterAppId:事件网格订阅编写器应用的Microsoft Entra应用程序 ID。

    注意

    无需修改 $eventGridAppId 的值。 在此脚本中,AzureEventGridSecureWebhookSubscriber 被设置为 $eventGridRoleName。 请记住,必须是 Microsoft Entra 应用程序管理员角色的成员或成为 Microsoft Entra ID 中 Webhook 应用服务主体的所有者才能执行此脚本。

  8. 通过运行以下命令,以事件网格订阅编写器身份登录Microsoft Entra应用程序。

    az login --service-principal -u [REPLACE_WITH_EVENT_GRID_SUBSCRIPTION_WRITER_APP_ID] -p [REPLACE_WITH_EVENT_GRID_SUBSCRIPTION_WRITER_APP_SECRET_VALUE] --tenant [REPLACE_WITH_TENANT_ID]
    
  9. 运行以下命令以创建订阅。

    az eventgrid system-topic event-subscription create --name [REPLACE_WITH_SUBSCRIPTION_NAME] -g [REPLACE_WITH_RESOURCE_GROUP] --system-topic-name [REPLACE_WITH_SYSTEM_TOPIC] --endpoint [REPLACE_WITH_WEBHOOK_ENDPOINT] --event-delivery-schema [REPLACE_WITH_WEBHOOK_EVENT_SCHEMA] --azure-active-directory-tenant-id [REPLACE_WITH_TENANT_ID] --azure-active-directory-application-id-or-uri [REPLACE_WITH_APPLICATION_ID_FROM_SCRIPT] --endpoint-type webhook
    

    注意

    这种场景使用系统主题。 如果要使用 Azure CLI 为自定义主题或域创建订阅,请参阅 CLI 参考

  10. 如果已正确配置所有内容,则可以在事件网格主题中创建 Webhook 订阅。

    注意

    此时,事件网格在每条消息中都会将 Microsoft Entra 持有者令牌传递给 Webhook 客户端。 你需要验证 Webhook 中的授权令牌。

将事件传送到不同的 Microsoft Entra 租户中的 Webhook

若要保护事件订阅与位于不同 Microsoft Entra 租户中的 Webhook 终结点之间的连接,请使用 Microsoft Entra ID application,如本节所示。 目前,无法在 Azure 门户中使用 Microsoft Entra ID user 来保护此连接。

Microsoft Entra ID 和 Webhooks 图的多租户事件截图

根据该图执行以下步骤来配置两个租户。

租户 A

完成 租户 A 中的以下步骤:

  1. 为配置成可与任何 Microsoft Entra(多租户)配合使用的事件网格订阅写入器创建 Microsoft Entra 应用程序。

  2. 为Microsoft Entra应用程序创建机密并保存值(稍后需要此值)。

  3. 转到事件网格主题的 访问控制(IAM) 页。 将 Event Grid 参与者角色分配给事件网格订阅编写器的Microsoft Entra应用程序。 使用Microsoft Entra应用程序和Azure CLI登录Azure时,此步骤授予应用程序对事件网格资源的访问权限。

租户 B

租户 B 中,完成以下步骤:

  1. 为配置为使用 Microsoft Entra(单租户)的 Webhook 创建 Microsoft Entra 应用程序。

  2. 打开 Azure Shell,然后选择 PowerShell 环境。

  3. 修改 $webhookAadTenantId 值以连接到 租户 B

    • 变量:

      • $webhookAadTenantIdTenant B 的 Azure 租户 ID
      $webhookAadTenantId = "[REPLACE_WITH_YOUR_TENANT_ID]"
      Connect-MgGraph -TenantId $webhookAadTenantId -Scopes "Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All"
      
  4. 打开 以下脚本,并使用标识符更新 $webhookAppObjectId$eventSubscriptionWriterAppId 的值。 然后,继续运行脚本。

    • 变量:
      • $webhookAppObjectId:为 Webhook 创建的Microsoft Entra应用程序 ID

      • $eventSubscriptionWriterAppId:事件网格订阅编写器Microsoft Entra应用程序 ID

        注意

        无需修改 $eventGridAppId 的值。 在此脚本中,AzureEventGridSecureWebhookSubscriber 已为 $eventGridRoleName 设置。 请记住,必须是 Microsoft Entra 应用程序管理员角色的成员或成为 Microsoft Entra ID 中 Webhook 应用服务主体的所有者才能执行此脚本。

    如果看到以下错误消息,则需要提升到服务主体身份。 2021 年 3 月 30 日,我们在事件订阅的创建或更新中引入了附加访问检查,以解决安全漏洞。 订阅客户端的服务主体需要是所有者之一或在目标应用程序服务主体中分配了角色。

    New-MgServicePrincipalAppRoleAssignment: Error occurred while executing NewServicePrincipalAppRoleAssignment
    Code: Authorization_RequestDenied
    Message: Insufficient privileges to complete the operation.
    

租户 A

租户 A 中,完成以下步骤:

  1. 打开 PowerShell,并通过运行以下命令以事件网格订阅编写器身份登录Microsoft Entra应用程序。

    az login --service-principal -u [REPLACE_WITH_APP_ID] -p [REPLACE_WITH_SECRET_VALUE] --tenant [REPLACE_WITH_TENANT_ID]
    
  2. 运行以下命令以创建订阅。

    az eventgrid system-topic event-subscription create --name [REPLACE_WITH_SUBSCRIPTION_NAME] -g [REPLACE_WITH_RESOURCE_GROUP] --system-topic-name [REPLACE_WITH_SYSTEM_TOPIC] --endpoint [REPLACE_WITH_WEBHOOK_ENDPOINT] --event-delivery-schema [REPLACE_WITH_WEBHOOK_EVENT_SCHEMA] --azure-active-directory-tenant-id [REPLACE_WITH_TENANT_B_ID] --azure-active-directory-application-id-or-uri [REPLACE_WITH_APPLICATION_ID_FROM_SCRIPT] --endpoint-type webhook
    

    注意

    在此方案中,你将使用事件网格系统主题。 若要使用 Azure CLI 为自定义主题或事件网格域创建订阅,请参阅 here

  3. 如果已正确配置所有内容,则可以在事件网格主题中创建 Webhook 订阅。

    注意

    此时,事件网格在每个消息中将Microsoft Entra持有者令牌传递给 Webhook 客户端。 你需要验证 Webhook 中的授权令牌。