Leer en inglés

Compartir a través de

使用 Microsoft Entra ID 授权访问队列

Azure 存储支持使用 Microsoft Entra ID 来授权对队列数据的请求。 可以通过 Microsoft Entra ID 使用 Azure 基于角色的访问控制 (Azure RBAC) 授予对安全主体的访问权限,该安全主体可能是用户、组或应用程序服务主体。 安全主体由 Microsoft Entra ID 进行身份验证,以返回 OAuth 2.0 令牌。 然后,可以使用令牌来授权针对队列服务的请求。

与共享密钥授权相比,使用 Microsoft Entra ID 进行授权提供了更高的安全性和易用性。 Azure 建议尽可能对队列应用程序使用 Microsoft Entra 授权,以确保具有最低所需权限的访问。

具有 Microsoft Entra ID 的授权适用于所有区域中的所有常规用途存储帐户。 仅通过 Azure 资源管理器部署模型创建的存储帐户支持 Microsoft Entra 授权。

Microsoft Entra ID 队列概述

当安全主体(用户、组或应用程序)尝试访问队列资源时,必须授权请求,除非它是可用于匿名访问的队列。 如果使用 Microsoft Entra ID,访问资源流程需要两步:

  1. 首先,验证安全主体的身份并返回 OAuth 2.0 令牌。

    身份验证步骤要求应用程序在运行时请求 OAuth 2.0 访问令牌。 如果应用程序在 Azure 实体(例如 Azure VM、虚拟机规模集或 Azure Functions 应用)中运行,则可以使用 托管标识 来访问队列数据。

  2. 接下来,将该令牌作为请求的一部分传递给队列服务,服务将使用它来授权访问指定的资源。

    授权步骤要求向发出请求的安全主体分配一个或多个 Azure RBAC 角色。 有关详细信息,请参阅分配 Azure 角色以提供访问权限

将 Microsoft Entra 帐户与门户、PowerShell 或 Azure CLI 配合使用

要了解如何使用 Microsoft Entra 帐户在 Azure 门户中访问数据,请参阅从 Azure 门户访问数据。 要了解如何使用 Microsoft Entra 帐户调用 Azure PowerShell 或 Azure CLI 命令,请参阅从 PowerShell 或 Azure CLI 访问数据

使用 Microsoft Entra ID 在应用程序代码中授予访问权限

若要使用 Microsoft Entra ID 授权访问 Azure 存储,可以使用以下客户端库之一来获取 OAuth 2.0 令牌:

Azure 标识客户端库

Azure 标识客户端库借助 Azure SDK 简化了用于 Microsoft Entra ID 授权的 OAuth 2.0 访问令牌的获取过程。 适用于 .NET、Java、Python、JavaScript 和 Go 的最新版本的 Azure 存储客户端库与适用于每种对应语言的 Azure 标识库集成,提供了一种简单而安全的方法来获取用于授权 Azure 存储请求的访问令牌。

Azure 标识客户端库的优点在于,它使你可以使用相同的代码来获取访问令牌,无论你的应用程序是在开发环境中运行还是在 Azure 中运行。 Azure 标识客户端库返回安全主体的访问令牌。 当代码在 Azure 中运行时,安全主体可以是 Azure 资源的托管标识、服务主体或者用户或组。 在开发环境中,客户端库为用户主体或服务主体提供用于测试的访问令牌。

Azure 标识客户端库返回的访问令牌封装在令牌凭据中。 然后,可以使用该令牌凭据来获取服务客户端对象,以用于对 Azure 存储执行授权的操作。 获取访问令牌和令牌凭据的一种简单方法就是使用 Azure 标识客户端库提供的 DefaultAzureCredential 类。 DefaultAzureCredential 尝试通过按顺序试用几种不同的凭据类型来获取令牌凭据。 DefaultAzureCredential 在开发环境和 Azure 中工作正常。

下表指出了在各种方案中授权访问数据的其他信息:

语言 .NET 爪哇岛 Javascript Python语言 走吧
Microsoft Entra ID 授权概述 如何在 Azure 服务中对 .NET 应用程序进行身份验证 使用 Java 和 Azure 标识进行 Azure 身份验证 使用 Azure SDK 向 Azure 验证 JavaScript 应用的身份 使用 Azure SDK 向 Azure 验证 Python 应用的身份
使用开发人员服务主体进行身份验证 使用服务主体在本地开发期间向 Azure 服务验证 .NET 应用的身份 使用服务主体进行 Azure 身份验证 使用服务主体向 Azure 服务验证 JS 应用的身份 在本地开发期间使用服务主体向 Azure 服务验证 Python 应用的身份 使用服务主体进行 Azure SDK for Go 身份验证
使用开发人员或用户帐户进行身份验证 在本地开发期间使用开发人员帐户对访问 Azure 服务的 .NET 应用进行身份验证 使用用户凭据进行 Azure 身份验证 使用开发帐户向 Azure 服务验证 JS 应用的身份 使用开发人员帐户在本地开发期间向 Azure 服务验证 Python 应用的身份 使用 Azure SDK for Go 进行 Azure 身份验证
从 Azure 托管的应用进行身份验证 使用 Azure SDK for .NET 对访问 Azure 资源的 Azure 托管应用进行身份验证 对 Azure 托管的 Java 应用程序进行身份验证 使用 Azure SDK for JavaScript 向 Azure 资源验证 Azure 托管 JavaScript 应用的身份 使用 Azure SDK for Python 向 Azure 资源验证 Azure 托管应用的身份 使用托管标识通过 Azure SDK for Go 进行身份验证
从本地应用进行身份验证 从本地托管的 .NET 应用向 Azure 资源进行身份验证 向 Azure 资源验证本地 JavaScript 应用的身份 从本地托管的 Python 应用向 Azure 资源进行身份验证
标识客户端库概述 适用于 .NET 的 Azure 标识客户端库 适用于 Java 的 Azure 标识客户端库 适用于 JavaScript 的 Azure 标识客户端库 适用于 Python 的 Azure 标识客户端库 适用于 Go 的 Azure 标识客户端库

Microsoft身份验证库 (MSAL)

虽然 Microsoft 建议尽可能使用 Azure 标识客户端库,但 MSAL 库可能适合在某些高级方案中使用。 有关详细信息,请参阅了解 MSAL

使用 MSAL 获取用于访问 Azure 存储的 OAuth 令牌时,需要提供 Microsoft Entra 资源 ID。 Microsoft Entra 资源 ID 指示受众可将向其颁发的令牌用于提供对 Azure 资源的访问权限。 在使用 Azure 存储时,资源 ID 可能特定于单个存储帐户,也可能适用于任何存储帐户。

提供特定于单个存储帐户和服务的资源 ID 时,资源 ID 用于获取令牌,以便仅授权对指定帐户和服务的请求。 下表列出了要用于资源 ID 的值。 将 <account-name> 替换为存储帐户的名称。

资源标识符
由世纪互联运营的 Microsoft Azure https://<account-name>.queue.core.chinacloudapi.cn

还可以提供适用于任何存储帐户的资源 ID,如下表所示。 此资源 ID 用于获取令牌,以授权向任何存储帐户发出的请求。

资源标识符
由世纪互联运营的 Microsoft Azure https://storage.azure.com/

分配 Azure 角色以授予访问权限

Microsoft Entra 通过 Azure RBAC 授权访问受保护的资源。 Azure 存储定义一组内置 RBAC 角色,其中包含用于访问队列数据的公共权限集。 还可以定义用于访问队列数据的自定义角色。 若要详细了解如何分配用于队列访问的 Azure 角色,请参阅 “分配 Azure 角色以访问队列数据”。

Microsoft Entra 安全主体可以是用户、组、应用程序服务主体,也可以是 Azure 资源的托管标识。 分配给安全主体的 RBAC 角色确定主体将拥有的权限。 若要详细了解如何分配用于队列访问的 Azure 角色,请参阅 “分配 Azure 角色以访问队列数据”

在某些情况下,可能需要对队列资源启用精细访问,或者在为存储资源分配大量角色时简化权限。 可以使用 Azure 基于属性的访问控制 (Azure ABAC) 来配置角色分配的条件。 可以将条件用于自定义角色,或选择内置角色。 有关使用 ABAC 为 Azure 存储资源配置条件的详细信息,请参阅 使用 Azure 角色分配条件授权访问队列。 有关队列数据操作支持的条件的详细信息,请参阅 Azure 队列中的 Azure 角色分配条件的操作和属性

Nota

创建 Azure 存储帐户时,系统不会自动向你分配通过 Microsoft Entra ID 访问数据的权限。 必须将 Azure 角色显式分配给您自己才能访问队列存储。 可以在订阅、资源组、存储帐户或队列级别分配它。

资源范围

向安全主体分配 Azure RBAC 角色之前,请确定安全主体应具有的访问权限的范围。 最佳做法指出,最好是授予尽可能小的范围。 在较广范围内中定义的 Azure RBAC 角色由其下的资源继承。

可以在以下级别限定对 Azure 队列资源的访问范围,从最窄的范围开始:

  • 单个队列。 在此范围内,角色分配适用于队列中的消息,以及队列属性和元数据。
  • 存储帐户。 在此范围内,角色分配适用于所有队列及其消息。
  • 资源组。 在此范围内,角色分配适用于资源组中所有存储帐户中的所有队列。
  • 订阅。 在此范围内,角色分配适用于订阅中所有资源组中的所有存储帐户中的所有队列。
  • 管理组。 在此范围内,角色分配适用于管理组中所有订阅的所有资源组里的所有存储帐户的所有队列。

有关 Azure RBAC 角色分配范围的详细信息,请参阅了解 Azure RBAC 的范围

Azure 内置队列角色

Azure RBAC 提供了多个内置角色,用于使用 Microsoft Entra ID 和 OAuth 授权访问队列数据。 某些角色可在 Azure 存储中提供数据资源权限,例如:

若要了解如何将 Azure 内置角色分配给安全主体,请参阅 分配 Azure 角色以访问队列数据。 若要了解如何列出 Azure RBAC 角色及其权限,请参阅列出 Azure 角色定义

有关如何为 Azure 存储定义内置角色的详细信息,请参阅了解角色定义。 若要了解如何创建 Azure 自定义角色,请参阅 Azure 自定义角色

只有为数据访问显式定义的角色才允许安全主体访问队列数据。 内置角色(如 所有者参与者存储帐户参与者 )允许安全主体管理存储帐户,但不能通过 Microsoft Entra ID 提供对该帐户中的队列数据的访问权限。 但是,如果角色包括 Microsoft.Storage/storageAccounts/listKeys/action,则分配了该角色的用户可以使用帐户访问密钥通过共享密钥授权来访问存储帐户中的数据。 有关详细信息,请参阅选择如何在 Azure 门户中授予对队列数据的访问权限

要详细了解数据服务和管理服务的 Azure 存储的 Azure 内置角色,请参阅 Azure RBAC 的 Azure 内置角色的“存储”部分。 此外,若要了解 Azure 中提供权限的不同类型的角色,请参阅 Azure 角色和 Microsoft Entra 角色、经典订阅管理员角色

Importante

Azure 角色分配最多需要 30 分钟时间来进行传播。

数据操作访问权限

有关调用特定队列服务操作所需的权限的详细信息,请参阅 调用数据操作的权限

使用 Microsoft Entra 帐户访问数据

可以使用用户的 Microsoft Entra 帐户或使用帐户访问密钥(共享密钥授权)来授权通过 Azure 门户、PowerShell 或 Azure CLI 访问队列数据。

Precaución

不建议使用共享密钥进行授权,因为它可能不太安全。 为获得最佳安全性,请禁用存储帐户的共享密钥授权,如阻止对 Azure 存储帐户进行共享密钥授权中所述。

对访问密钥和连接字符串的使用应限于不访问生产数据或敏感数据的初始概念证明应用或开发原型。 否则,在向 Azure 资源进行身份验证时,应始终优先使用 Azure SDK 中提供的基于令牌的身份验证类。

Azure 建议客户端使用 Microsoft Entra ID 或共享访问签名 (SAS) 来授权访问 Azure 存储中的数据。 要了解详细信息,请参阅授权数据访问操作

通过 Azure 门户访问数据

Azure 门户可以使用 Microsoft Entra 帐户或帐户访问密钥来访问 Azure 存储帐户中的队列数据。 Azure 门户使用哪种授权方案取决于分配给你的 Azure 角色。

在您尝试访问队列数据时,Azure 门户首先会检查您是否已被分配 Azure 角色,其中包含 Microsoft.Storage/storageAccounts/listkeys/action。 如果已被分配此操作的角色,则 Azure 门户使用帐户密钥通过共享密钥授权访问队列数据。 如果未分配有包含此操作的角色,则 Azure 门户会尝试使用你的 Microsoft Entra 帐户访问数据。

若要使用 Microsoft Entra 帐户从 Azure 门户访问队列数据,需要访问队列数据的权限,还需要有权在 Azure 门户中浏览存储帐户资源。 Azure 存储提供的内置角色授予对队列资源的访问权限,但不会向存储帐户资源授予权限。 出于此原因,访问门户还需要分配范围为存储帐户或更高级别的 Azure 资源管理器角色,例如读取者角色。 “读取者”角色授予限制性最高的权限,但也接受可授予存储帐户管理资源访问权限的其他 Azure 资源管理器角色。 若要详细了解如何使用 Microsoft Entra 帐户在 Azure 门户中为用户分配数据访问权限,请参阅 分配 Azure 角色以访问队列数据

Azure 门户网站在您导航到队列时显示正在使用的授权方案。 有关门户中数据访问的详细信息,请参阅 “选择如何授权访问 Azure 门户中的队列数据”。

通过 PowerShell 或 Azure CLI 访问数据

Azure CLI 和 PowerShell 支持使用 Microsoft Entra 凭据登录。 登录后,会话将在这些凭据下运行。 有关详细信息,请参阅以下文章之一:

后续步骤