使用Microsoft Graph API读取SharePoint图片遇权限问题的技术咨询
兄弟,你已经找到一个能用的 workaround 了(靠@microsoft.graph.downloadUrl下载图片转成缩略图),不过估计你也好奇为啥webUrl会直接被拒,以及有没有更顺手的处理方式对吧?
为啥webUrl访问会被拦?
- 权限上下文不对路:
webUrl是SharePoint原生的资源链接,它认的是浏览器里用户的登录会话权限,但你的Azure MVC应用是在服务器端用Graph API拿的这个链接,浏览器访问的时候根本没带Graph API调用时用的那套权限(不管是应用权限还是用户委托权限),SharePoint自然不认,直接给你拒了。 - 跨域或站点权限限制:就算用户浏览器里已经登了Office 365,
webUrl也可能因为你的MVC应用和SharePoint站点的跨域设置,或者站点/列表项本身的权限管控,导致没法直接访问。
给你的现有方案提几个优化点
你用HttpClient下载转字节数组的思路没问题,这里给你加几个小技巧:
- 缓存缩略图:如果这些图片不会天天变,把生成好的缩略图存到Azure Blob Storage或者应用本地缓存里,别每次请求都去调用Graph API下载,能省不少性能开销。
- 直接用Graph API的缩略图接口:其实Graph API本身就支持直接拿不同尺寸的缩略图,不用自己手动转。你在获取列表项的API里加个
$expand=thumbnails参数就行,比如:
返回结果里的GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items?$expand=fields,thumbnailsthumbnails会包含small、medium、large几种尺寸的链接,这些链接是经过Graph API授权的,直接用在页面里展示就行,不会有权限问题。
另一种思路:生成可直接访问的共享链接
要是你还是想用类似webUrl的链接展示,可以通过Graph API生成共享链接,步骤很简单:
- 先拿到图片对应的
driveItem信息(SharePoint列表里的图片本质也是Drive里的文件):GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items/{item-id}/driveItem - 调用创建共享链接的接口:
返回的POST https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items/{item-id}/driveItem/createLink Content-Type: application/json { "type": "view", "scope": "organization" }link对象里的webUrl就是可以在你的组织内部(或者你设置的scope范围里)直接访问的链接,不会出现权限被拒的情况。
总的来说,你现在的方案是能用的,但用Graph API自带的缩略图功能或者生成共享链接,代码会更简洁,性能也更好。
内容的提问来源于stack exchange,提问作者aherrick




