使用Microsoft Graph API创建SharePoint禁下载共享链接授权外部用户报错
问题原因
你遇到的One or more users could not be resolved错误本质是Microsoft Graph API无法识别你传入的授权对象,常见诱因有以下几点:
具体排查&修正方案
- 1. 共享链接scope参数配置错误
你当前创建链接时CreateLink方法的第二个参数(scope)传入的是users,如果你的租户未开启外部共享权限,该scope默认仅允许授予组织内部用户访问权限,无法添加外部用户。
若你需要给特定外部用户授权:先在SharePoint管理中心开启租户外部共享权限,允许和组织外指定用户共享文件,保持scope为users即可。
若你需要创建所有人可访问的禁止下载链接:直接将scope改为anyone,创建完成后无需再调用Grant接口授权,拿到的链接直接可以对外分享。 - 2. recipients参数格式错误
调用Grant接口时传入的recipients不能直接是邮箱字符串集合,必须构造为DriveRecipient实例,且正确填写Email属性,错误的标识格式会导致Graph无法解析用户。
正确的参数构造示例:var recipients = new List<DriveRecipient>() { new DriveRecipient() { Email = "external_user@example.com" // 填写正确的外部用户邮箱 } }; var roles = new List<string>() { "read" }; // blocksDownload类型的链接仅支持读权限 - 3. 租户安全策略限制
部分租户的安全策略默认禁止向外部用户分享带禁止下载限制的文件,可在SharePoint管理中心的共享策略中检查该配置是否开启。 - 4. 权限不足
确认你调用Graph API的应用账号已授予Files.ReadWrite.All或Sites.ReadWrite.All的应用/委托权限,且已完成管理员同意。
修正后完整代码示例
// 创建禁止下载的共享链接,scope根据需求选择users/anyone Permission linkresult = driveItemRequestBuilder.CreateLink("blocksDownload", "users", null, null, null).Request().PostAsync().Result; // 编码共享链接,原有逻辑无需修改 string base64Value = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(linkresult.Link.WebUrl)); string encodedUrl = "u!" + base64Value.TrimEnd('=').Replace('/', '_').Replace('+', '-'); // 构造授权参数 var recipients = new List<DriveRecipient>() { new DriveRecipient() { Email = "external_user@example.com" } }; var roles = new List<string>() { "read" }; // 调用授权接口 IPermissionGrantCollectionPage grantedPermissions = this.GraphClient.Shares[encodedUrl].Permission.Grant(roles, recipients).Request().PostAsync().Result;
内容的提问来源于stack exchange,提问作者Sebastian Achorner
相关产品推荐
相关产品推荐

