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

使用 Microsoft Entra ID 进行身份验证和授权

本文介绍如何使用 Microsoft Entra ID 对 Azure 事件网格发布客户端进行身份验证。

概述

Microsoft 标识平台针对使用 Microsoft Entra ID 作为其标识提供者的资源和应用程序提供集成的身份验证和访问控制管理。 使用 Microsoft 标识平台在应用程序中提供身份验证和授权支持。 它基于 OAuth 2.0 和 OpenID Connect 等开放标准,并提供支持许多身份验证方案的工具和开放源代码库。 它提供条件访问等高级功能,可(例如)设置需要多重身份验证的策略或允许从特定位置访问。

使用 Microsoft Entra ID 时提高安全性情况的一个优势是无需将凭据(如身份验证密钥)存储在代码或存储库中。 而是,在向受保护资源进行身份验证时,从应用程序所提供的 Microsoft 标识平台获取 OAuth 2.0 访问令牌。 可以将事件发布应用程序注册到 Microsoft Entra ID,并获取与所管理和使用的应用相关联的服务主体。 相反,可以将系统分配或用户分配的托管标识用于甚至更简单的标识管理模型,因为标识生命周期的某些方面是托管的。

基于角色的访问控制 (RBAC) 允许以某种方式配置授权,使某些安全主体(用户、组或应用的标识)具有对 Azure 资源执行操作的特定权限。 这样,将事件发送到事件网格的客户端应用程序所使用的安全主体必须具有与之关联的 RBAC 角色“EventGrid 数据发送方”。

安全主体

讨论事件网格发布客户端的身份验证时,有两大类安全主体适用:

  • “托管标识”。 托管标识可以是系统分配的,在 Azure 资源上启用并只关联到该资源,也可以是用户分配的,由用户显式创建和命名。 用户分配的托管标识可以关联到多个资源。
  • “应用程序安全主体”。 它是一种表示应用程序的安全主体,访问受 Microsoft Entra ID 保护的资源。

无论使用何种安全主体(托管标识或应用程序安全主体),客户端都会使用该标识在 Microsoft Entra ID 之前进行身份验证,并获取在将事件发送到事件网格时随请求一起发送的 OAuth 2.0 访问令牌。 该令牌经过加密签名,事件网格收到令牌后,会验证该令牌。 例如,受众(令牌的目标接收方)确认为事件网格 (https://eventgrid.azure.net) 等。 令牌包含有关客户端标识的信息。 事件网格采用该标识,并验证客户端是否分配有角色“EventGrid 数据发送方”。 更准确地说,在允许事件发布请求完成之前,事件网格会验证标识是否具有与标识相关联的 RBAC 角色的 Microsoft.EventGrid/events/send/action 权限。

如果使用的是事件网格 SDK,则无需担心如何实现获取访问令牌以及如何在事件网格的每一个请求中包括访问令牌的详细信息,因为事件网格数据平面 SDK 会执行这些操作。

使用 Microsoft Entra 身份验证的客户端配置步骤

执行以下步骤,将客户端配置为在将事件发送到主题、域或合作伙伴命名空间时使用 Microsoft Entra 身份验证。

  1. 创建或使用要用于身份验证的安全主体。 如果可以使用托管标识应用程序安全主体
  2. 通过向安全主体分配“EventGrid 数据发送方”角色,向安全主体授予发布事件的权限
  3. 使用事件网格 SDK 将事件发布到事件网格。

使用托管标识进行身份验证

托管标识是与 Azure 资源关联的标识。 托管标识提供应用程序在使用支持 Microsoft Entra 身份验证的资源时使用的标识。 应用程序可以使用托管资源(如虚拟机或 Azure 应用服务)的托管标识来获取 Microsoft Entra 令牌,该令牌在将事件发布到事件网格时随请求一起提供。 当应用程序连接时,事件网格会将托管实体的上下文绑定到客户端。 与托管标识关联后,事件网格发布客户端便能执行所有授权操作。 授权是通过将托管标识关联到事件网格 RBAC 角色来授予的。

托管标识为 Azure 服务提供了 Microsoft Entra ID 中的自动托管标识。 与其他身份验证方法相反,对于标识本身或需要访问的资源,都不需要在应用程序代码或配置中存储和保护访问密钥或共享访问签名 (SAS)。

若要使用托管标识对事件发布客户端进行身份验证,请首先确定客户端应用程序的托管 Azure 服务,然后在该 Azure 服务实例上启用系统分配或用户分配的托管标识。 例如,可以在 VMAzure 应用服务或 Azure Functions 上启用托管标识。

在托管服务中配置托管标识后,分配将事件发布到该标识的权限

使用客户端应用程序的安全主体进行身份验证

除了托管标识,另一个标识选项是为客户端应用程序创建安全主体。 为此,需要使用 Microsoft Entra ID 注册客户端应用程序。 注册应用程序是一种指示,可以将标识和访问管理控制委托给 Microsoft Entra ID。 执行注册应用程序部分和添加客户端机密部分中的步骤。 请确保在开始前查看先决条件

拥有应用程序安全主体并执行上述步骤后,分配将事件发布到该标识的权限

注意

在门户中注册应用程序时,会在主租户中自动创建应用程序对象服务主体。 或者,可以使用 Microsot Graph 注册应用程序。 但是,如果使用 Microsoft Graph API 注册或创建应用程序,则通过一个单独步骤创建服务主体对象。

向安全主体分配发布事件的权限

用于将事件发布到事件网格的标识必须具有允许其将事件发送到事件网格的权限 Microsoft.EventGrid/events/send/action。 该权限包含在内置 RBAC 角色事件网格数据发送者中。 可以将此角色分配到给定范围安全主体,该范围可以是管理组、Azure 订阅、资源组或特定事件网格主题、域或合作伙伴命名空间。 执行分配 Azure 角色中的步骤为安全主体分配“EventGrid 数据发送方”角色,以此方式授予使用该安全主体的应用程序发送事件的访问权限。 或者,可以定义包含 Microsoft.EventGrid/events/send/action 权限的自定义角色,并将该自定义角色分配给安全主体。

处理 RBAC 特权后,现在可以构建客户端应用程序以将事件发送到事件网格。

注意

除了发送事件之外,事件网格还支持更多 RBAC 角色。 有关详细信息,请参阅事件网格内置角色

使用事件网格的客户端 SDK 发布事件

使用事件网格数据平面 SDK 将事件发布到事件网格。 事件网格的 SDK 支持所有身份验证方法,包括 Microsoft Entra 身份验证。

下面是使用 .NET SDK 将事件发布到事件网格的示例代码。 可以在 Azure 门户的“概述”页上获取事件网格主题的主题终结点。 其格式为:https://<TOPIC-NAME>.<REGION>-1.eventgrid.azure.net/api/events

ManagedIdentityCredential managedIdentityCredential = new ManagedIdentityCredential();
EventGridPublisherClient client = new EventGridPublisherClient( new Uri("<TOPIC ENDPOINT>"), managedIdentityCredential);


EventGridEvent egEvent = new EventGridEvent(
        "ExampleEventSubject",
        "Example.EventType",
        "1.0",
        "This is the event data");

// Send the event
await client.SendEventAsync(egEvent);

先决条件

以下是向事件网格进行身份验证的先决条件。

使用 Microsoft Entra 身份验证发布事件

若要将事件发送到主题、域或合作伙伴命名空间,可以按照以下方式构建客户端。 首次提供 Microsoft Entra 身份验证支持的 API 版本为 2018-01-01。 在应用程序中使用该 API 版本或更新版本。

示例:

此 C# 代码片段使用具有客户端机密的应用程序(服务主体)来创建事件网格发布方客户端,若要启用 DefaultAzureCredential 方法,需要添加 Azure.Identity 库。 如果使用官方 SDK,则 SDK 会为你处理版本。

Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", "");
Environment.SetEnvironmentVariable("AZURE_TENANT_ID", "");
Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", "");

EventGridPublisherClient client = new EventGridPublisherClient(new Uri("your-event-grid-topic-domain-or-partner-namespace-endpoint"), new DefaultAzureCredential());

有关详细信息,请参阅以下文章:

禁用密钥和共享访问签名身份验证

Microsoft Entra 身份验证提供的身份验证支持优于访问密钥或共享访问签名 (SAS) 令牌身份验证所提供的身份验证支持。 使用 Microsoft Entra 身份验证时,将针对 Microsoft Entra 标识提供者来验证标识。 作为开发人员,如果使用 Microsoft Entra 身份验证,则不需要在代码中处理密钥。 还会受益于内置于 Microsoft 标识平台的所有安全功能,例如条件访问,有助于提高应用程序的安全性情况。

决定使用 Microsoft Entra 身份验证后,可以禁用基于访问密钥或 SAS 令牌的身份验证。

注意

访问密钥或 SAS 令牌身份验证是一种“本地身份验证”形式。 当讨论此类不依赖于 Microsoft Entra ID 的身份验证机制时,有时会听到“local auth”。 用于禁用本地身份验证的 API 参数因而称作 disableLocalAuth

Azure 门户

创建新主题时,可以在“创建主题”页的“高级”选项卡上禁用本地身份验证。

Screenshot showing the Advanced tab of Create Topic page when you can disable local authentication.

对于现有主题,请按照以下步骤禁用本地身份验证:

  1. 导航到主题的“事件网格主题”页,并选择“本地身份验证”下的“启用”

    Screenshot showing the Overview page of an existing topic.

  2. 在“本地身份验证”弹出窗口中,选择“禁用”,然后选择“确定”。

    Screenshot showing the Local Authentication window.

Azure CLI

以下 CLI 命令演示了创建禁用本地身份验证的自定义主题的方法。 禁用本地身份验证功能目前以预览版提供,需要使用 API 版本 2021-06-01-preview

az resource create --subscription <subscriptionId> --resource-group <resourceGroup> --resource-type Microsoft.EventGrid/topics --api-version 2021-06-01-preview --name <topicName> --location <location> --properties "{ \"disableLocalAuth\": true}"

作为参考,以下是根据正在创建或更新的主题可以使用的资源类型值。

主题类型 资源类型
Microsoft.EventGrid/domains
合作伙伴命名空间 Microsoft.EventGrid/partnerNamespaces
自定义主题 Microsoft.EventGrid/topics

Azure PowerShell

如果使用的是 PowerShell,则使用以下 cmdlet 创建禁用本地身份验证的自定义主题。


Set-AzContext -SubscriptionId <SubscriptionId>

New-AzResource -ResourceGroupName <ResourceGroupName> -ResourceType Microsoft.EventGrid/topics -ApiVersion 2021-06-01-preview -ResourceName <TopicName> -Location <Location> -Properties @{disableLocalAuth=$true}

注意

资源