Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
本文介绍如何使用 Microsoft Entra ID 对发布客户端Azure 事件网格进行身份验证。
概述
Microsoft Identity 平台为使用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 访问令牌,该令牌随请求一起发送用于将事件发送到 Event Grid。 该令牌经过加密签名,事件网格收到令牌后,会验证该令牌。 例如,受众(令牌的目标接收方)确认为事件网格 (https://eventgrid.azure.cn) 等。 令牌包含有关客户端标识的信息。 事件网格获取该标识,并验证客户端是否分配有角色“EventGrid 数据发送方”。 更确切地说,事件网格在允许事件发布请求完成之前,验证标识在与标识关联的 RBAC 角色中是否具有 Microsoft.EventGrid/events/send/action 权限。
如果您正在使用事件网格 SDK,您无需担心如何获取访问令牌以及如何在每个请求中包含它,因为事件网格数据平面 SDK 已为您完成这些操作。
使用Microsoft Entra身份验证的客户端配置步骤
执行以下步骤,将客户端配置为在将事件发送到主题、域或合作伙伴命名空间时使用Microsoft Entra身份验证。
- 创建或使用要用于身份验证的安全主体。 可以使用托管标识或应用程序安全主体。
- 通过向安全主体分配“EventGrid 数据发送方”角色,向安全主体授予发布事件的权限。
- 使用事件网格 SDK 将事件发布到事件网格。
使用托管标识进行身份验证
托管标识是与Azure资源关联的标识。 托管标识为应用程序提供了在使用支持Microsoft Entra身份验证的Azure资源时所需的标识。 应用程序可以使用托管资源(如虚拟机或 Azure 应用服务)的托管身份来获取 Microsoft Entra 令牌,这些令牌将在将事件发布到事件网格时随请求一起呈现。 当应用程序连接时,事件网格会将托管实体的上下文绑定到客户端。 与托管标识关联后,事件网格发布客户端便能执行所有授权操作。 授权是通过将托管实体关联到事件网格 RBAC 角色来授予的。
托管标识在Microsoft Entra ID中为Azure服务提供自动托管标识。 与其他身份验证方法相反,对于标识本身或需要访问的资源,都不需要在应用程序代码或配置中存储和保护访问密钥或共享访问签名 (SAS)。
若要使用托管标识对事件发布客户端进行身份验证,请先决定客户端应用程序的托管Azure服务,然后在该Azure服务实例上启用系统分配的或用户分配的托管标识。 例如,可以在 VM、Azure 应用服务或 Azure 函数 上启用托管标识。
在托管服务中配置托管标识后,分配将事件发布到该标识的权限。
使用客户端应用程序的安全主体进行身份验证
除了托管标识,另一个标识选项是为客户端应用程序创建安全主体。 为此,需要向Microsoft Entra ID注册应用程序。 注册应用程序是一种手势,通过该手势将标识和访问控制委托给Microsoft Entra ID。 执行注册应用程序部分和添加客户端机密部分中的步骤。 请确保在开始前查看先决条件。
拥有应用程序安全主体并执行上述步骤后,请为该标识分配发布事件的权限。
注意
在门户中注册应用程序时,会在主租户中自动创建应用程序对象和服务主体。 或者,可以使用Microsoft Graph来注册应用程序。 但是,如果使用 Microsoft Graph API 注册或创建应用程序,则创建服务主体对象是一个单独的步骤。
向安全主体分配发布事件的权限
用于将事件发布到事件网格的标识必须具有允许将事件发送到事件网格的权限Microsoft.EventGrid/events/send/action。 该权限包含在内置 RBAC 角色事件网格数据发送者中。 对于给定的范围,可以将此角色分配给安全主体,范围可以是管理组、Azure 订阅、资源组,或特定的事件网格主题、域或合作伙伴命名空间。 按照 Assign Azure 角色中的步骤将安全主体分配到 EventGrid 数据发送者角色,并以此方式授予应用程序使用该安全主体访问权限发送事件。 或者,可以定义包含 权限的 Microsoft.EventGrid/events/send/action,并将该自定义角色分配给安全主体。
处理 RBAC 特权后,现在可以构建客户端应用程序以将事件发送到事件网格。
注意
除了发送事件之外,事件网格还支持更多 RBAC 角色。 有关详细信息,请参阅事件网格内置角色。
使用事件网格的客户端 SDK 发布事件
使用事件网格数据平面 SDK 将事件发布到事件网格。 事件网格的 SDK 支持所有身份验证方法,包括Microsoft Entra身份验证。
下面是使用 .NET SDK 将事件发布到事件网格的示例代码。 可以在 Azure 门户中事件网格主题的 Overview 页上获取主题终结点。 其格式为:https://<TOPIC-NAME>.<REGION>-1.eventgrid.azure.cn/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);
先决条件
以下是向事件网格进行身份验证的先决条件。
- 在应用程序上安装 SDK。
- 安装Azure标识客户端库。 事件网格 SDK 依赖于Azure标识客户端库进行身份验证。
- 创建的主题、域或合作伙伴命名空间,应用程序将向其发送事件。
使用Microsoft Entra身份验证发布事件
若要将事件发送到主题、域或合作伙伴命名空间,可以按照以下方式构建客户端。 首次为 Microsoft Entra 身份验证提供支持的 API 版本是2018-01-01。 在应用程序中使用该 API 版本或更新版本。
示例:
要使用应用程序(服务主体)和客户端密码创建事件网格发布者客户端,您需要添加 Azure.Identity 库 以启用 DefaultAzureCredential 方法。 如果使用官方 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());
有关详细信息,请参阅以下文章:
- 适用于 Java 的 Azure 事件网格 客户端库
- 适用于 .NET 的 Azure 事件网格 客户端库
- 适用于 JavaScript 的 Azure 事件网格 客户端库
- 适用于 Python 的 Azure 事件网格 客户端库
禁用密钥和共享访问签名身份验证
Microsoft Entra 身份验证提供的身份验证支持优于访问密钥或共享访问签名(SAS)令牌身份验证。 使用Microsoft Entra身份验证时,身份将通过Microsoft Entra身份提供者进行验证。 作为开发人员,如果使用Microsoft Entra身份验证,则无需在代码中处理密钥。 你还将受益于 Microsoft 身份平台中内置的所有安全功能,例如 Conditional Access,这可以帮助你改进应用程序的安全性。
一旦您决定使用 Microsoft Entra 身份验证,可以禁用基于访问密钥或 SAS 令牌的身份验证。
注意
访问密钥或 SAS 令牌身份验证是一种“本地身份验证”形式。 在讨论不依赖于Microsoft Entra ID的此类身份验证机制时,有时将听到引用“本地身份验证”。 用于禁用本地身份验证的 API 参数因而称作 disableLocalAuth。
Azure门户
创建新主题时,可以在“创建主题”页的“高级”选项卡上禁用本地身份验证。
对于现有主题,请按照以下步骤禁用本地身份验证:
导航到事件网格主题页面,然后在本地身份验证下选择启用
在“本地身份验证”弹出窗口中,选择“禁用”,然后选择“确定”。
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}
注意
- 若要了解使用访问密钥或共享访问签名身份验证,请参阅使用密钥或 SAS 令牌对发布客户端进行身份验证
- 本文介绍将事件发布到事件网格(事件传入)时的身份验证。 传递事件(事件传出)时对事件网格进行身份验证是对事件处理程序的事件传递进行身份验证一文的主题。
资源
- 数据平面 SDK
- Java SDK:GitHub | 示例 | 从上一版 SDK 迁移指南
- .NET SDK:GitHub | 示例 | 从以前的 SDK 版本迁移指南
- Python SDK:GitHub | 示例 | 从旧版 SDK 迁移指南
- JavaScript SDK:GitHub | 示例 | 从以前版本的 SDK 的迁移指南
- 事件网格 SDK 博客
- Azure标识客户端库
- 了解托管标识
- 了解 如何对 App Service 和 Azure Functions 使用托管标识
- 了解应用程序和服务主体
- 了解在Microsoft 身份平台上注册应用。
- 了解授权(RBAC 访问控制)的工作原理。
- 了解事件网格内置 RBAC 角色,包括其事件网格数据发送者角色。 事件网格的角色列表。
- 了解将 RBAC 角色分配给身份。
- 了解如何定义自定义 RBAC 角色。
- 了解 Microsoft Entra ID 中的应用程序和服务主体对象。
- 了解 Microsoft 标识平台访问令牌。
- 了解 OAuth 2.0 身份验证代码流和Microsoft标识平台