共用方式為

配置搜索服务以使用托管标识进行连接

可以将 Microsoft Entra ID 的安全主体和角色分配用于从 Azure AI Search 发起与其他 Azure 资源的出站连接,这些资源在索引或查询期间提供数据、应用 AI 或向量化功能。

若要在出站连接上使用角色,请先将搜索服务配置为使用 系统分配的托管标识或用户分配的托管标识作为Microsoft Entra租户中搜索服务的安全主体。 获得托管标识后,你可以为授权的访问分配角色。 托管身份和角色分配消除了在连接字符串或代码中传递机密信息和凭据的需要。

先决条件

  • 基本层或更高层的搜索服务(任何区域中)。

  • 一个 Azure 资源,它接受来自具有有效角色分配的 Microsoft Entra 安全主体的传入请求。

  • 若要创建托管标识,你必须具有“所有者角色”或“用户访问管理员角色”。 若要分配角色,你必须是一个所有者、用户访问管理员、基于角色的访问控制管理员,或者是拥有 Microsoft.Authorization/roleAssignments/write 权限的自定义角色的成员。

支持的方案

可以将托管身份用于这些方案。

Scenario System 用户分配
连接到索引器数据源1 是的 2
连接到 Azure 密钥保管库以使用由客户管理的密钥 是的 是的
连接到调试会话(托管在 Azure 存储中)1 是的
连接到扩充缓存(托管在 Azure Storage)1,4 是的 2
连接到知识库(托管在 Azure 存储中)1 是的 2

1 对于搜索和存储之间的连接,网络安全会对可以使用哪种类型的托管标识施加约束。 只有系统托管身份可用于与 Azure Storage 的同一区域连接,并且该连接必须通过 受信服务例外 或资源实例规则。 有关详细信息,请参阅访问受网络保护的存储帐户

2 用户分配的托管标识可用于数据源连接字符串。 但是,只有较新的预览版 REST API 和预览包支持connection string中用户分配的托管标识。 如果您将 SearchIndexerDataUserAssignedIdentity 设置为数据源连接中的 identity,请务必切换至预览 API。

4 AI 搜索服务当前无法连接到 已关闭共享密钥访问的存储帐户上的表。

创建系统托管标识

系统分配的托管标识是一个Microsoft Entra ID安全主体,自动创建并链接到Azure资源,例如Azure AI Search服务。

对于每个搜索服务,可以有一个系统分配的托管标识。 它对于搜索服务是唯一的,并绑定到服务的生命周期。

启用系统分配的托管标识时,Microsoft Entra ID为搜索服务创建一个安全主体,用于向其他Azure资源进行身份验证。 然后,可以在角色分配中使用此标识来授权访问数据和操作。

  1. Azure 门户中,转到你的搜索服务。

  2. 在左窗格中,选择 “设置>标识”。

  3. 在“系统分配”选项卡上的“状态”下,选择“开”

  4. 选择“保存”

    Azure 门户中标识页的屏幕截图。

    保存设置后,页面将更新以显示分配给搜索服务的对象标识符。

    系统标识对象标识符的屏幕截图。

创建用户分配的托管标识

用户分配的托管标识是一种Azure资源,可以限定为订阅、资源组或资源类型。

可以创建多个用户分配的托管身份,以便更精细地进行角色分配。 例如,你可能希望针对不同的应用程序和方案使用单独的标识。 作为独立创建和管理的资源,它不会绑定到服务本身。

设置用户分配的托管标识的步骤如下:

  • 在Azure订阅中,创建用户分配的托管标识。

  • 在搜索服务中,将用户分配的托管标识与搜索服务相关联。

  • 在要连接到的其他Azure服务上,为标识创建角色分配。

Azure门户、搜索管理 REST API 和提供该功能的 SDK 包支持将用户分配的托管标识与Azure AI Search服务相关联。

  1. 登录到 Azure 门户

  2. 在仪表板的左上角,选择“创建资源”。

  3. 使用搜索框查找 用户分配的托管标识,然后选择“ 创建”。

    Azure Marketplace 中用户分配的托管标识磁贴的屏幕截图。

  4. 选择订阅、资源组和区域。 为标识提供描述性名称。

  5. 选择“创建”,并等待资源完成部署。

    使用标识前需要几分钟时间。

  6. 在搜索服务页上,选择 “设置>标识”。

  7. 在“用户分配”选项卡上,选择“添加”。

  8. 选择之前创建的订阅和用户分配的托管标识。

分配角色

获得托管标识后,请分配用于确定对Azure资源的搜索服务权限的角色。

  • 索引器数据连接和访问Azure Key Vault中客户管理的密钥需要读取权限。

  • AI 扩充功能需要写入权限,这些功能使用Azure Storage在知识存储中托管调试会话数据、扩充缓存和长期内容存储。

下面的步骤演示了角色分配的工作流。 有关其他Azure资源,请参阅 Connect 到 Azure StorageConnect 到 Azure Cosmos DBConnect 到 Azure SQL

  1. Azure 门户 中转到 Azure AI services 资源

  2. 在左侧菜单中选择“访问控制”

  3. 依次选择“添加”、“添加角色分配”

  4. 在“成员”下,选择“托管标识”,然后选择“成员”

  5. 按订阅和资源类型(搜索服务)进行筛选,然后选择搜索服务的托管标识。

  6. 选择审核 + 分配

连接字符串示例

回忆一下之前情景描述中的内容,你可以在连接字符串中使用托管身份来连接其他 Azure 资源。 本部分提供了示例。 可以使用通用的 REST API 版本和Azure SDK包来使用系统分配的托管标识进行连接。

小窍门

可以在 Azure 门户中创建上述大部分对象,指定系统分配或用户分配的托管标识,然后查看 JSON 定义以获取连接字符串。

下面是各种方案的连接字符串的一些示例。

Blob 数据源(系统托管标识):

索引器数据源包含一个 credentials 属性,用于确定如何与数据源建立连接。 以下示例演示指定存储帐户资源的唯一 ID 的连接字符串。

当连接字符串是具有 Microsoft Entra ID 的服务或应用程序的唯一资源 ID 时,系统托管标识将被指示。 用户分配的托管标识是通过属性 identity 指定的。

"credentials": {
    "connectionString": "ResourceId=/subscriptions/{subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Storage/storageAccounts/{storage-account-name};"
    }

Blob 数据源(用户托管标识):

用户分配的托管标识也可以在索引器数据源连接字符串中使用。 但是,只有较新的预览版 REST API 和预览包支持在数据源连接字符串中使用用户分配的托管标识。 如果将 SearchIndexerDataUserAssignedIdentity 设置为数据源连接中的标识,请务必切换到预览版。

在属性中 identity 指定了搜索服务用户标识。

"credentials": {
    "connectionString": "ResourceId=/subscriptions/{subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Storage/storageAccounts/{storage-account-name};"
    },
  . . .
"identity": {
    "@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
    "userAssignedIdentity": "/subscriptions/{subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{user-assigned-managed-identity-name}"
  }

知识存储:

知识存储定义包括用于Azure Storage的连接字符串。 连接字符串是存储帐户的唯一资源 ID。 请注意,该字符串没有在路径中包括容器或表。 这些是在嵌入式投影定义中规定的,而不是在连接字符串中。

"knowledgeStore": {
  "storageConnectionString": "ResourceId=/subscriptions/{subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Storage/storageAccounts/storage-account-name};"
}

扩充缓存:

索引器创建、使用并记住用于缓存扩充的容器。 无需在缓存连接字符串中包含容器。 可以在 Azure 门户中搜索服务的 Identity 页上找到对象 ID。

"cache": {
  "enableReprocessing": true,
  "storageConnectionString": "ResourceId=/subscriptions/{subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Storage/storageAccounts/{storage-account-name};"
}

调试会话:

调试会话在Azure门户中运行,并在启动会话时接受连接字符串。 你可以粘贴类似于以下示例的字符串。

"ResourceId=/subscriptions/{subscription-ID}/resourceGroups/{resource-group-name}/providers/Microsoft.Storage/storageAccounts/{storage-account-name}/{container-name};",

自定义技能:

自定义技能面向托管自定义代码的 Azure 函数或应用终结点。

  • uri 是函数或应用的终结点。

  • authResourceId 可使搜索服务使用托管标识进行连接,并在属性中传递目标函数或应用的应用程序 ID。

{
  "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
  "description": "A custom skill that can identify positions of different phrases in the source text",
  "uri": "https://contoso.count-things.com",
  "authResourceId": "<Azure-AD-registered-application-ID>",
  "batchSize": 4,
  "context": "/document",
  "inputs": [ ... ],
  "outputs": [ ...]
}

检查防火墙访问

如果Azure资源位于防火墙后面,请确保存在允许来自搜索服务和Azure门户的请求的入站规则。

另请参阅