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

时间:2015-02-08 23:28:32

标签: sharepoint csom

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

我有一些返回列表的工作代码

// 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);
        }

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

2 个答案:

答案 0 :(得分:2)

修改后的示例

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

}

答案 1 :(得分:0)

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

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

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

    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;

    }