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

使用 Azure Active Directory 授权访问搜索应用

重要

针对数据平面操作(例如创建或查询索引)的基于角色的访问控制目前以公共预览版提供,使用此功能需要遵守补充使用条款。 此预览版功能仅在公有云区域中可用,可能会影响操作延迟。 有关预览版限制的详细信息,请参阅 RBAC 预览版限制

基于 Azure 认知搜索生成的搜索应用程序现在可以使用 Microsoft 标识平台进行经过身份验证和授权的访问。 Azure 上的标识提供者是 Azure Active Directory (Azure AD)。 使用 Azure AD 的一个重要优势是不再需要将凭据和 API 密钥存储在代码中。 Azure AD 对运行应用程序的安全主体(用户、组或服务)进行身份验证。 如果身份验证成功,Azure AD 会将访问令牌返回应用程序,应用程序可随之使用访问令牌对 Azure 认知搜索请求授权。

本文介绍如何针对 Azure AD 配置客户端:

  • 若要进行身份验证,需要创建托管标识作为安全原则。 还可以使用不同类型的服务主体对象,不过本文将使用托管标识,因为其无需管理凭据。

  • 关于授权,需要将一个 Azure 角色分配给托管标识,该标识负责授予运行查询或管理索引作业的权限。

  • 更新客户端代码以调用 DefaultAzureCredential()

准备搜索服务

首先第一步,请注册预览版并在搜索服务上启用基于角色的访问控制 (RBAC)。

注册预览版

数据平面操作的 RBAC 处于预览状态。 在此步骤中,需将预览功能添加到 Azure 订阅。

  1. 打开 Azure 门户并找到你的搜索服务

  2. 在左侧导航窗格中,选择“密钥”。

  3. 在提到预览版的蓝色横幅中,选择“注册”,将该功能添加到订阅。

    显示如何在门户中注册 RBAC 预览版的屏幕截图

此外,还可使用 Azure 功能公开控制 (AFEC) 并搜索针对搜索服务的基于角色的访问控制(预览版)来注册预览版。 有关添加预览功能的详细信息,请参阅在 Azure 订阅中设置预览功能

注意

将预览版添加到订阅后,订阅中的所有搜索服务都将永久注册到预览版中。 如果不想要针对给定服务使用 RBAC,可为数据平面操作禁用 RBAC,如后续步骤所示。

为数据平面操作启用 RBAC

将订阅添加到预览版后,仍然需要为数据平面操作启用 RBAC,以便可以使用 Azure AD 身份验证。 默认情况下,Azure 认知搜索对数据平面操作使用基于密钥的身份验证,但你可以更改设置,以允许基于角色的访问控制。

  1. Azure 门户中导航到你的搜索服务。

  2. 在左侧导航窗格中,选择“密钥”。

  3. 选择是允许基于密钥和基于角色的访问控制,还是仅允许基于角色的访问控制。

    门户中 Azure 认知搜索的身份验证选项的屏幕截图

还可以按照 Azure 认知搜索 RBAC 文档中所述以编程方式更改这些设置。

创建托管标识

在此步骤中,需为客户端应用程序创建托管标识

  1. 登录 Azure 门户

  2. 搜索“托管标识”。

  3. 选择“+ 新建”。

  4. 为托管标识指定一个名称并选择一个区域。 然后选择“创建”。

    “创建托管标识”向导的屏幕截图。

为托管标识分配角色

接下来,需要向托管标识授予对搜索服务的访问权限。 Azure 认知搜索具有各种内置角色。 还可以创建自定义角色

最佳做法是授予最低权限。 如果应用程序只需要处理查询,则你应该分配搜索索引数据读取者(预览版)角色。 或者,如果它需要具有搜索索引的读写权限,则应使用搜索索引数据参与者(预览版)角色。

  1. 登录 Azure 门户

  2. 导航到你的搜索服务。

  3. 在左侧导航窗格中,选择“访问控制 (IAM)”。

  4. 选择“+ 添加” > “添加角色分配”。

    打开了“添加角色分配”菜单的“访问控制(IAM)”页。

  5. 选择适用的角色:

    • 所有者
    • 参与者
    • 读取器
    • 搜索服务参与者
    • 搜索索引数据参与者(预览版)
    • 搜索索引数据读取者(预览版)

    有关可用角色的详细信息,请参阅搜索中使用的内置角色

    备注

    “所有者”、“参与者”、”读取者”和“搜索服务参与者”角色不提供对搜索索引中的数据的访问权限,因此无法使用这些角色查询搜索索引或索引数据。 若要对搜索索引进行数据访问,则需要“搜索索引数据参与者”或“搜索索引数据读取者”角色。

  6. 在“成员”选项卡上,选择要授予搜索服务访问权限的托管标识。

  7. 在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。

如果应用程序需要全面访问搜索服务、对象和内容,则可以分配多个角色,例如“搜索服务参与者”和“搜索索引数据参与者”。

还可以使用 PowerShell 分配角色

在客户端中设置 Azure AD 身份验证

针对搜索服务获取托管标识和角色分配后,即可向应用程序添加代码,以对安全主体进行身份验证并获取 OAuth 2.0 令牌。

适用于 JavaPythonJavaScript 的预览版 SDK 也支持 Azure AD 身份验证。

注意

若要详细了解 Azure AD 使用的 OAuth 2.0 代码授权流,请参阅使用 OAuth 2.0 代码授权流来授权访问 Azure Active Directory Web 应用程序

使用 Azure SDK 可以轻松与 Azure AD 集成。 11.4.0-beta.2 和更高版本的 .NET SDK 支持 Azure AD 身份验证。

以下说明引用现有的 C# 示例来演示代码更改。

  1. 首先,请克隆 C# 快速入门源代码

    该示例目前使用基于密钥的身份验证和 AzureKeyCredential 来创建 SearchClientSearchIndexClient,但只需做出一项轻微的更改即可切换到基于角色的身份验证。

  2. 接下来,导入 Azure.Identity 库以获取对其他身份验证技术的访问权限。

  3. 与其在 Program.csMain() 开头使用 AzureKeyCredential,不如使用 DefaultAzureCredential,如下面的代码片段所示:

    // Create a SearchIndexClient to send create/delete index commands
    SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, new DefaultAzureCredential());
    // Create a SearchClient to load and query documents
    SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, new DefaultAzureCredential());
    

备注

用户分配的托管标识仅适用于 Azure 环境。 如果在本地运行此代码,则 DefaultAzureCredential 将回退到使用凭据进行身份验证。 如果计划在本地运行代码,请确保也为自己提供了对搜索服务所需的访问权限。

Azure.Identity 文档包含有关 DefaultAzureCredential通过用于 .NET 的 Azure SDK 使用 Azure AD 身份验证的其他详细信息。 DefaultAzureCredential 旨在通过使用合理的默认行为处理常见方案来简化 SDK 入门。 对于想要拥有更多控制或其方案缺少默认设置的开发人员,应使用其他凭据类型。

请参阅