
Azure AI Search 接入 SharePoint Online 文档:从 Entra 授权到知识源创建
Azure AI Search 接入 SharePoint Online 文档:从 Entra 授权到知识源创建
用 Azure AI Search 的 Indexed SharePoint Knowledge Source 把 SharePoint Online 文档库接入检索与智能体知识库。本文按顺序说明权限方式选择、托管标识启用、Entra 应用注册与站点级授权、联合凭据配置、门户向导创建知识源以及抓取结果校验,并给出 Graph Explorer 与 PnP PowerShell 两条授权路径。
把 SharePoint Online 里的文档库变成可检索的知识,是很多团队做企业搜索或智能体问答时的第一步。Azure AI Search 提供的 Indexed SharePoint Knowledge Source 就是为此设计的:创建知识源后,Azure AI Search 会自动生成 SharePoint 专用的数据源、技能组、索引和索引器,省去手工拼装各组件的麻烦。本文面向负责搭建检索服务的工程师与管理员,按顺序走完从权限规划到抓取校验的全过程。需要提前说明的是,SharePoint 索引器属于预览功能,功能范围与可用性可能变化,落地前请以官网当前信息为准。
准备工作
开始之前,先确认下面这些条件都已具备,否则中途很容易卡在授权环节。
- 一个可用的 Azure AI Search 服务。
- 一个 SharePoint Online 站点,以及要抓取的目标文档库。
- 能够为目标站点配置权限的 SharePoint 管理员。
- 能够注册 Microsoft Entra 应用并授予管理员同意的管理员。
- 创建知识源所需的 Azure AI Search 权限。推荐使用 Search Service Contributor 与 Search Index Data Contributor。
- 如果要做向量化,需要提前部署嵌入模型,例如 Foundry 模型中的嵌入模型。
另外要理解整体结构:知识源只是把数据源、技能组、索引、索引器打包在一起的封装。即使不通过知识源,而是手工分别配置这些组件,基本的设置流程也是一致的。本文走的是门户向导这条路径。
操作步骤
第一步:确定 SharePoint 的权限方式
抓取用的 Entra 应用需要具备读取 SharePoint 内容的应用程序权限。常见的有两种选择,访问范围差别很大,实际配置时按需求二选一即可。
| 权限 | 访问范围 | 设置后还需要做什么 |
|---|---|---|
| Sites.Read.All | 应用可广泛读取租户内的 SharePoint 站点 | 为 Entra 应用授予管理员同意 |
| Sites.Selected | 应用只能访问被单独指定的站点 | 除管理员同意外,还要为每个目标站点单独授予应用权限 |
对于标准的文档库抓取场景,一种常见做法是把 Microsoft Graph 的应用程序权限设为 Files.Read.All 与 Sites.Read.All。如果选择 Sites.Selected,仅添加权限是不够的,必须逐个站点授权,否则应用依然读不到内容。
第二步:启用 Azure AI Search 的托管标识
在 Azure 门户中打开 Azure AI Search 服务,进入「设置」下的「标识」,把「系统分配」的状态切换为开启并保存。保存后页面上会显示该标识的对象(主体)ID,请记下来——后面为 Entra 应用创建联合凭据时,需要用它来指定信任哪个托管标识。
第三步:注册抓取用的 Entra 应用并配置权限
在 Azure 门户中进入「Microsoft Entra ID」→「应用注册」→「新注册」,输入应用名称,在目标租户中完成注册。
接着打开该应用的「API 权限」,选择「添加权限」→「Microsoft Graph」→「应用程序权限」,按上一步选定的方式添加:
- 使用 Sites.Read.All 方式时:添加 Sites.Read.All、Files.Read.All、User.Read。
- 使用 Sites.Selected 方式时:添加 Sites.Selected、Files.Read.All、User.Read。
添加完成后,选择「代表管理员授予同意」。这一步需要具备授予租户级管理员同意的管理员来操作。
如果选择的是 Sites.Selected,还需要为每个要索引的 SharePoint 站点单独授予应用访问权限。抓取内容的目的下,至少授予 read 角色。下面给出两条路径,按组织策略选择其一。
路径 A:用 Graph Explorer 执行 REST API
Graph Explorer 是 Microsoft 提供的一个应用,以登录用户的身份委派权限来调用 Microsoft Graph API。使用它本身也需要为 Graph Explorer 授予委派权限并完成管理员同意,这与前面给抓取应用授予 Sites.Selected 管理员同意是两件独立的事。
1. 登录并授予 Graph Explorer 权限。打开 Graph Explorer,用目标租户的管理员账号登录。如果弹出读取用户信息的同意提示,选择同意。然后在个人资料菜单中找到「Consent to permissions」,搜索 Sites.FullControl.All 并点击同意。在管理员同意页面确认请求的权限与目标组织后,选择「以组织代表的身份同意」。这一步需要能够授予租户级管理员同意的管理员。仅仅登录并不会自动获得 Sites.FullControl.All。同意页面是否出现、何时出现,取决于现有的同意状态与组织策略;如果所需权限此前已由管理员同意,页面可能不再弹出。若组织不允许向 Graph Explorer 授权,请改用下面的 PowerShell 路径。
2. 获取目标站点的 siteId。假设目标站点 URL 为 https://<tenant>.sharepoint.com/sites/AUSearch,在 Graph Explorer 中执行:
GET https://graph.microsoft.com/v1.0/sites/<tenant>.sharepoint.com:/sites/AUSearch
响应中的 id 就是下一步要用的 siteId。它的格式是主机名、站点集合 ID、站点 ID 三者用逗号连接:
{
"id": "contoso.sharepoint.com,<site-collection-id>,<site-id>",
"webUrl": "https://contoso.sharepoint.com/sites/AUSearch"
}
在 Graph Explorer 中读取站点,要求登录用户本身能访问该站点,同时 Graph Explorer 侧具备所需的 Microsoft Graph 权限。调用是以登录用户的委派权限执行的。
3. 通过 REST API 给抓取应用授予 read。把上一步拿到的完整 id 填入 URL 中的 {siteId} 位置,执行下面的 POST 请求。请求体里 application.id 填抓取应用的客户端 ID:
POST https://graph.microsoft.com/v1.0/sites/{siteId}/permissions
Content-Type: application/json
{
"roles": ["read"],
"grantedToIdentities": [
{
"application": {
"id": "<抓取用应用的客户端ID>",
"displayName": "<抓取用应用的显示名>"
}
}
]
}
抓取应用的客户端 ID 与显示名可以在应用注册的概述页面找到。返回 201 Created,且响应中包含目标应用与 roles: ["read"],即表示授权成功。
路径 B:用 PnP PowerShell 配合管理用应用
如果组织不允许把权限委派给 Graph Explorer,可以另外创建一个管理用应用,在 PowerShell 登录时使用。这条路径同样是对交互式登录的委派认证,使用的是登录管理员的权限,区别只是委派对象从 Microsoft 提供的 Graph Explorer 换成了自己注册的应用。
1. 安装 PnP PowerShell。在 PowerShell 7.4 及以上版本中执行:
Install-Module PnP.PowerShell -Scope CurrentUser
请使用 PowerShell 7,不要用 Windows PowerShell 5.1。
2. 准备 PowerShell 管理用的 Entra 应用。这个应用要与 Azure AI Search 的抓取应用分开注册。如果组织已有获批的 PnP 管理用应用,可以直接复用。两者的分工如下:
| 应用 | 用途 | 与站点授权相关的 Microsoft Graph 权限 |
|---|---|---|
| 抓取用应用 | Azure AI Search 读取目标站点 | 应用程序权限 Sites.Selected |
| PowerShell 管理用应用 | 管理员为抓取应用授予站点权限 | 委派权限 Sites.FullControl.All |
管理用应用的配置步骤:在「Microsoft Entra ID」→「应用注册」→「新注册」中注册,记下应用程序(客户端)ID;在「认证」→「添加平台」→「移动应用和桌面应用」中,把重定向 URI 设为 http://localhost;在「API 权限」→「添加权限」→「Microsoft Graph」→「委派权限」中添加 Sites.FullControl.All,并由有权限的管理员选择「代表管理员授予同意」。
3. 以管理员身份连接并授予 read。把下面的值替换成实际环境后执行。浏览器打开后,用具备 SharePoint 管理员及以上角色的账号登录:
$siteUrl = "https://<tenant>.sharepoint.com/sites/<site-name>"
$managementAppId = "<PowerShell 管理用应用的客户端ID>"
$ingestionAppId = "<抓取用应用的客户端ID>"
Connect-PnPOnline `
-Url $siteUrl `
-ClientId $managementAppId `
-Interactive
$permission = Grant-PnPEntraIDAppSitePermission `
-AppId $ingestionAppId `
-DisplayName "<抓取用应用的显示名>" `
-Permissions Read `
-Site $siteUrl
$permission
注意区分两个 ID:Connect-PnPOnline 的 -ClientId 是管理用应用,Grant-PnPEntraIDAppSitePermission 的 -AppId 是抓取用应用。不要与 Azure AI Search 的托管标识混淆。
4. 确认已授予的权限。执行下面的命令,检查返回的 Roles 是否为 read:
Get-PnPEntraIDAppSitePermission `
-Site $siteUrl `
-PermissionId $permission.Id
Disconnect-PnPOnline
这里有一个限制:不指定 PermissionId 的查询不会显示 Roles,所以要使用授权时返回的 ID 来查询。如果目标站点有多个,需要逐个站点执行连接、授权与确认。
第四步:为 Entra 应用添加联合凭据
打开抓取用应用注册的「证书和密码」→「联合凭据」,选择「添加凭据」。场景选择「托管标识」,然后选中第二步启用的 Azure AI Search 托管标识,起个名字并保存。这样 Entra 应用就会信任 Azure AI Search 的托管标识,实现无需密码的认证。
第五步:在门户向导中创建知识源
1. 打开创建页面。在 Azure 门户中打开目标 Azure AI Search 服务,进入「Agentic retrieval」→「Knowledge sources」→「添加知识源」,选择用于 SharePoint 索引抓取的来源类型。
2. 配置 SharePoint 连接信息。输入知识源名称后,启用托管标识认证,用第三步、第四步准备好的抓取应用与联合认证连接目标 SharePoint 站点。需要填写的信息如下:
| 设置项 | 取值 |
|---|---|
| SharePoint 站点 URL | 要抓取的站点 URL |
| 应用程序 ID | 已配置 SharePoint 权限的抓取用应用的客户端 ID |
| 租户 ID | 拥有该 SharePoint 站点的 Entra 租户 ID |
| 联合认证使用的 ID | Azure AI Search 托管标识的对象 ID |
应用程序 ID 与租户 ID 可以在应用的概述页面确认,联合认证使用的 ID 可以在应用的「证书和密码」页面确认。
在指定文档库与抓取范围的项目中,确认目标库。抓取默认文档库的设置对应默认站点库(API 上为 defaultSiteLibrary)。如果要用 query 指定抓取范围,容器名使用 useQuery。下面是查询栏的输入示例,URL 请替换为实际的站点与库:
- 只抓取特定文档库:
includeLibrary=<库的URL> - 从站点内全部库中排除指定库:
includeLibrariesInSite=<库的URL>,多个用分号;分隔。
要注意,query 只用于指定抓取对象,并不会扩大应用的访问权限。
如果界面要求填写连接字符串,使用下面的格式:
SharePointOnlineEndpoint=https://<tenant>.sharepoint.com/sites/<site-name>;ApplicationId=<抓取用应用的客户端ID>;TenantId=<SharePoint的租户ID>;FederatedCredentialApplicationId=<Search托管标识的客户端ID>
连接字符串方式下,ApplicationId 是抓取用应用的客户端 ID,FederatedCredentialApplicationId 是 Azure AI Search 托管标识的客户端 ID。不要填成 Graph Explorer 或 PowerShell 管理用应用的 ID,也不要填托管标识的对象 ID。客户端 ID 可以在 Entra ID 中通过搜索对象 ID 得到。
3. 确认向量化等抓取设置。如果要做文本向量化,在向导的向量化设置中指定准备好的嵌入模型资源与部署。访问模型时使用 Azure AI Search 的托管标识进行认证,因此该托管标识还需要在嵌入模型资源上具备 Cognitive Services User 或 Foundry User 角色。如果界面出现图像处理、同步计划、权限元数据抓取等项目,按实际用途确认即可。若希望检索时反映 SharePoint 的权限,需要额外关注 ACL 相关的配置。
4. 检查设置并创建。确认站点 URL、认证信息、抓取范围与模型设置后创建知识源。创建完成后,确认它出现在 Knowledge sources 列表中。随着知识源创建,SharePoint 用的数据源、技能组、索引与索引器也会一并生成。
第六步:确认抓取状态
在 Azure 门户的 Azure AI Search 服务中打开生成的索引器,从运行历史查看抓取执行结果,确认没有错误或失败的文档;如果有警告,也要逐条查看内容。
接着打开生成的索引,确认文档数量,并用搜索资源管理器检索目标文档,验证结果是否符合预期。
一个完整示例
下面把关键环节串成一个最小可跑通的流程,站点为 https://contoso.sharepoint.com/sites/AUSearch,采用 Sites.Selected 方式。
- 在 Azure 门户中打开 Azure AI Search 服务,进入「设置」→「标识」,开启系统分配的托管标识,记下对象 ID。
- 在「Microsoft Entra ID」→「应用注册」中新建应用
sp-ingest-app,在「API 权限」中添加 Microsoft Graph 应用程序权限 Sites.Selected、Files.Read.All、User.Read,并授予管理员同意。 - 在 Graph Explorer 中登录管理员账号,为 Graph Explorer 授予 Sites.FullControl.All 的委派权限并完成管理员同意。
- 执行
GET https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/AUSearch,从响应中取出形如contoso.sharepoint.com,<site-collection-id>,<site-id>的id。 - 执行
POST https://graph.microsoft.com/v1.0/sites/{siteId}/permissions,请求体中的application.id填sp-ingest-app的客户端 ID,roles为["read"],确认返回 201 Created。 - 回到
sp-ingest-app的「证书和密码」→「联合凭据」,添加托管标识类型的凭据,选中第 1 步的 Azure AI Search 托管标识。 - 在 Azure AI Search 服务中进入「Agentic retrieval」→「Knowledge sources」→「添加知识源」,选择 SharePoint 来源,启用托管标识认证,填入站点 URL、
sp-ingest-app的客户端 ID、SharePoint 租户 ID 与托管标识对象 ID,抓取范围按需填写includeLibrary=。 - 创建知识源后,打开自动生成的索引器查看运行历史,再打开索引确认文档数量,并在搜索资源管理器中检索一篇已知文档。
注意事项
- SharePoint 索引器是预览功能,功能范围、可用性与行为可能变化,正式使用前请以官网当前信息为准。
- Sites.Selected 与 Sites.Read.All 的访问范围不同。选择 Sites.Selected 时,仅完成管理员同意并不能让应用读到站点内容,必须为每个目标站点单独授予 read 权限。
- 为 Graph Explorer 授予 Sites.FullControl.All 与为抓取应用授予 Sites.Selected 是两次独立的同意操作,不要混为一谈。若组织策略不允许向 Graph Explorer 委派权限,改用自建管理用应用配合 PnP PowerShell。
- PnP PowerShell 需要 PowerShell 7.4 及以上版本,不要使用 Windows PowerShell 5.1。
- 查询已授予的站点权限时,必须指定授权时返回的 PermissionId,否则返回结果中不会显示 Roles。
- 连接字符串中的
ApplicationId与FederatedCredentialApplicationId都要求客户端 ID,不要误填对象 ID,也不要填成 Graph Explorer 或管理用应用的 ID。 - query 参数只控制抓取对象,不会扩大应用的访问权限。
- 做向量化时,Azure AI Search 的托管标识需要在嵌入模型资源上具备 Cognitive Services User 或 Foundry User 角色。
- 多个目标站点需要逐个执行授权与确认。