检查当前用户是否可以查看 SharePoint CSOM 中的列表

Checking if current user can view list in SharePoint CSOM

如何确定当前用户是否可以在 SharePoint Online/Office365 中查看列表项或阅读列表?

我有一些工作代码 returns 列表

// Retrieve all lists from the server. 
        context.Load(web.Lists,
                     lists => lists.Include(list => list.Title,
                                            list => list.Id,                                                
                                            list => list.Hidden,
                                            list => list.BaseTemplate,
                                            list => list.BaseType));

        // Execute query. 
        context.ExecuteQuery();

        // Enumerate the web.Lists. 
        foreach (List list in web.Lists)
        {
            if (list.Hidden ||
                list.BaseType != BaseType.GenericList) continue;
           // .... check permissions here before adding ...
            names.Add(list.Id.ToString(), list.Title);
        }

但我不知道如何测试当前用户是否可以访问列表项。

您可能要考虑在组级别执行此操作。这将需要您根据该组设置访问权限或在现有组访问权限之上分层,但这非常简单(如果需要,我可以在那里详细介绍)。以下是这种方法的一些好处:

  • 您可以将一个组绑定到多个列表,这样您的代码可能会表现得更好
  • 从技术上讲,每个列表项可能具有不同的安全性,因此单独检查每个项目可能表现不佳

这些可能不适用于您,但真正适用的是检查用户是否属于特定组相对容易。这是一个示例函数,它将 return 组中的所有用户。您可能希望将其缓存在某处并检查当前用户。

    public List<User> GetGroupUsersList(string GroupName)
    {
        var retval = new List<User>();

        ClientContext context = GetContext();
        var groupList = context.Web.SiteGroups;

        context.Load(groupList);
        context.ExecuteQuery();

        var grp = groupList.Where(x => x.Title == GroupName).FirstOrDefault();
        context.Load(grp, y => y.Title, y => y.Users);
        context.ExecuteQuery();

        if (grp != null && grp.Users != null)
        {
            foreach (var usr in grp.Users)
            {
                retval.Add(usr);
            }
        }

        return retval;

    }

修改示例

ctx.Load(web.Lists,
           lists => lists.Include(list => list.Title,
                                  list => list.Id,
                                  list => list.Hidden,
                                  list => list.BaseTemplate,
                                  list => list.BaseType,
                                  list => list.EffectiveBasePermissions));

ctx.ExecuteQuery();

foreach (List list in web.Lists)
{
   if (list.Hidden ||
         list.BaseType != BaseType.GenericList) continue;

   if (!list.EffectiveBasePermissions.Has(PermissionKind.ViewListItems)) continue; //verity List permissions

}