使用Azure AD应用凭据调用Graph API无法获取全部SharePoint站点求助
我之前也碰到过一模一样的情况,核心问题大多出在权限配置细节或者API分页处理上,结合你的场景,给你几个排查和解决的方向:
1. 确认应用权限的类型与管理员同意状态
虽然你说已经配置了站点相关权限,但一定要区分应用权限和委托权限:
- 你用应用凭据(客户端凭据流)调用API,必须确保Azure AD应用中添加的是应用权限类型的
Sites.Read.All(不是委托权限的同名权限) - 应用权限必须由全局管理员或SharePoint管理员手动授予同意——哪怕你添加了权限,没点"授予管理员同意"按钮的话,应用实际是没有权限访问所有站点的
- 检查路径:Azure AD应用注册 → API权限页面,确认
Sites.Read.All权限的状态是"已授予[你的租户名]的管理员同意"
2. 处理Graph API的分页逻辑
这是最容易被忽略的坑:Graph API默认分页返回结果(默认每页20条),而Graph Explorer会自动帮你加载所有分页内容,所以看起来返回了全部站点,但你的应用如果只调用了一次https://graph.microsoft.com/v1.0/sites?search=*,只能拿到第一页的少量数据。
解决方法:
- 每次调用接口后,检查返回结果里的
@odata.nextLink字段 - 如果该字段存在,继续调用这个链接获取下一页数据,直到
@odata.nextLink不存在为止 - 简单的伪代码示例:
import requests token = "你的Bearer令牌" headers = {"Authorization": f"Bearer {token}"} url = "https://graph.microsoft.com/v1.0/sites?search=*" all_sites = [] while url: response = requests.get(url, headers=headers) response.raise_for_status() data = response.json() all_sites.extend(data.get("value", [])) url = data.get("@odata.nextLink") print(f"总共获取到 {len(all_sites)} 个站点")
3. 调整API请求参数试试
search=*在应用权限下的搜索范围可能和委托权限有差异,可以尝试以下参数组合:
- 直接调用
https://graph.microsoft.com/v1.0/sites(不带search参数),默认会返回租户下所有根站点和子站点 - 用
$filter筛选站点,比如https://graph.microsoft.com/v1.0/sites?$filter=siteCollection/root ne null(只返回网站集的根站点) - 增加
$top参数扩大单页返回量,比如https://graph.microsoft.com/v1.0/sites?search=*&$top=999(单页最多返回999条)
4. 检查应用的访问范围限制
如果你的Azure AD应用被配置了条件访问策略或者应用权限范围限制,也可能导致只能访问部分站点:
- 检查Azure AD的条件访问策略,确认没有针对该应用设置站点访问限制
- 检查SharePoint管理中心的应用权限管理,确认该应用没有被限制只能访问特定站点
内容的提问来源于stack exchange,提问作者Suraj Shelke
相关产品推荐
相关产品推荐

