【问题标题】:Access sharepoint files on behalf of a guest user代表来宾用户访问共享点文件
【发布时间】:2020-10-01 20:42:30
【问题描述】:

我正在尝试访问在 Sharepoint Online 中与 B2B 来宾用户共享的文件。我已在 Azure AD 中添加用户,并授予他们访问共享点站点中某些文件和文件夹的权限。他们可以通过 Web 门户访问它,但是当我通过图形 API 以他们的身份登录时,文件不会出现。

当我以 Azure AD(非来宾)用户身份执行此代码时,它运行正常并返回我有权访问的网站:

var sites = await _graphClient.Sites.Request(new List<QueryOption>()
                                    {
                                        new QueryOption("search", "")
                                    }).GetAsync();

但是,当我以访客用户身份登录时,我收到此错误:

ServiceException:代码:itemNotFound 消息:找不到项目

来宾用户是否有某种限制?如何查看与该用户共享的所有文件?

【问题讨论】:

    标签: microsoft-graph-api sharepoint-online


    【解决方案1】:

    所以看起来可能以稍微复杂的方式。由于我们不能使用搜索,这意味着我们必须保留一个(访客)用户注册到的所有共享点站点的列表。

    我注意到var sites = await _graphClient.Sites.Request().GetAsync(); 没有返回错误,而是给你一个空数组。

    首先,我们需要知道 Sharepoint 站点 ID。 Sites 资源有一个名为 GetByPath 的方法。这允许我们检索站点数据:

    var site = await _graphClient.Sites.GetByPath("/sites/Contoso-Customer1",
                          "contoso.sharepoint.com").Request().GetAsync();
    

    第一个参数是站点 url,第二个参数是站点域。上面的示例显示了https://contoso.sharepoint.com/sites/Contoso-Customer1 的值。

    现在我们可以获取站点 ID 并列出驱动器。为简洁起见,我在这里的示例中省略了几个空检查。 以下行将为我们提供驱动器:

    var drives = await _graphClient.Sites[site.Id].Drives.Request().GetAsync();
    

    我假设有一个驱动器。检索驱动器 ID 就像 var driveId = drives.First().Id

    然后我们需要列表的 ID。该列表包含文件和文件夹。

    var list = await _graphClient.Sites[site.Id]
                                 .Drives[driveId]
                                 .List
                                 .Request()
                                 .GetAsync();
    

    (编辑:我们也可以绕过驱动查询,直接获取列表:var lists = await _graphClient.Sites[site.Id].Lists.Request().GetAsync(); 。然后列表ID为lists.First().Id

    接下来我们可以检索列表中的所有项目:

    var listContent = await _graphClient.Sites[site.Id]
                                   .Lists[list.Id]
                                   .Items
                                   .Request()
                                   .GetAsync();
    

    现在我们可以获得所有详细的文件信息。对于这个例子,我只检索文件名:

     List<string> fileNames = new List<string>();
     foreach (var item in listContent)
     {
         var file = await _graphClient.Sites[site.Id].Lists[list.Id].Items[item.Id].DriveItem.Request().GetAsync();
         fileNames.Add(file?.Name);
     }
    

    试图直接获取文件数据是不行的,因为有些属性为空:

    listContent?.Select(x => new
                {
                    x.Id, // id of item in the list
                    x.Name, // null
                    x.ContentType,
                    DriveItemName = x.DriveItem?.Name, // null
                    x.WebUrl, // exact url to file
                }),
    

    _graphClient 变量基于教程here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多