Graph API权限异常:可读取列表列但无法读取列表项
问题描述
我可以通过Graph API的GET请求/v1.0/sites/{siteId}/lists/{listId}/columns查询列表列,但执行GET请求/v1.0/sites/{siteId}/lists/{listId}/items读取列表项时返回空数组(也尝试过追加?expand=fields(select=fieldName),其中fieldName为列查询返回的字段名),返回结果如下:
{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('{siteId}')/lists('{listId}')/items", "value": [] }
尝试通过POST请求创建行时收到访问拒绝提示。我使用SoapUI发送REST请求,应用拥有Sites.Selected API权限,且已通过链接https://{domain}.sharepoint.com/sites/{siteName}/_layouts/15/appinv.aspx为目标站点分配权限。根据文档说明,读取列和列表项所需权限相同(即Sites.Read.All),请问为何会出现该异常情况?
解决方案
以下是针对该问题的排查和解决步骤:
1. 检查站点权限配置的粒度与权限类型
通过appinv.aspx分配权限时,权限的作用范围和权限级别是核心问题:
- 如果仅给应用分配了站点级(
http://sharepoint/content/sitecollection/web)的Read权限,可能无法正常读取列表项(尤其是当列表权限继承被修改时),更无法创建项。 - 需确保权限XML针对目标列表配置了合适的权限:
- 若仅需读取列表项,使用:
<AppPermissionRequests AllowAppOnlyPolicy="true"> <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list/{listId}" Right="Read" /> </AppPermissionRequests> - 若需要创建项,需将
Right改为Write或FullControl。
- 若仅需读取列表项,使用:
2. 验证应用的实际有效权限
使用Graph API的应用身份调用以下端点,确认应用对目标列表的权限:
- 查询列表的有效权限:
检查返回结果中是否包含GET /v1.0/sites/{siteId}/lists/{listId}/effectivePermissionsRead(读取项)或Write(创建项)权限标识。
3. 排除列表本身的问题
- 确认目标列表实际存在列表项:手动登录SharePoint站点,检查该列表是否有数据,避免因列表为空导致返回空数组。
- 核对
siteId和listId的正确性:确保读取列表项时使用的ID与读取列时完全一致,避免误操作其他空列表。 - 检查列表权限继承:若列表或部分列表项的权限未继承站点权限,需单独给应用分配对应列表项的访问权限。
4. 确认Sites.Selected权限的配置逻辑
Sites.Selected权限要求两个条件同时满足:
- 应用必须在Azure AD中被授予
Sites.Selected(Delegated或Application类型)权限。 - 必须通过
appinv.aspx或Graph API给目标站点/列表分配具体权限。
若仅配置了其中一项,会导致权限不足的问题。
内容的提问来源于stack exchange,提问作者sjanisz
相关产品推荐
相关产品推荐

