For one of our provider-hosted apps, we had a situation where we had to Grant and Remove permissions to folders in a Document Library of a SharePoint Online site.

This blog gives the code for achieving it. In the code, you will see how:

  • It fetches the User ID and Password from the config file to log into the SharePoint site.
  • It uses SecureString to secure the Password. You have to use “using System.Security” to achieve this.
  • It also checks if the folder has unique permission before attempting to grant or remove permission. If not, it breaks the inheritance before granting or removing the permission.
  • Both, GrantPermission and RemovePermission, methods take string array with user accounts. In my case, we have only the user id in the array, so you will see we add “@domain.com” to get the email Id.

So, here is the code to grant permission.

  1. private static void GrantPermissionTo(params string[] accounts)
  2. {
  3. var DocumentLibName= "<YourDocumentLibraryName>"
  4. context = new ClientContext(webUrl);
  5. context.Credentials = new SharePointOnlineCredentials(userId, FetchPasswordFromConsole());
  6. Web web = context.Web;
  7. context.Load(web);
  8. context.ExecuteQuery();
  9. context.Load(web.Lists);
  10. context.ExecuteQuery();
  11. context.Load(web.SiteUsers);
  12. context.ExecuteQuery();
  13. context.Load(web.RoleDefinitions);
  14. context.ExecuteQuery();
  15. context.Load(web.RoleAssignments);
  16. context.ExecuteQuery();
  17. var list = web.Lists.OfType<List>().FirstOrDefault(l => l.Title.Equals(DocumentLibName, StringComparison.CurrentCultureIgnoreCase));
  18. context.Load(list);
  19. context.Load(list.RootFolder);
  20. context.ExecuteQuery();
  21. context.Load(list.RootFolder.Folders);
  22. context.ExecuteQuery();
  23. var folderName = Path.GetFileName("<YourFolderName>");
  24. var folder = list.RootFolder.Folders.OfType<Folder>().FirstOrDefault(t => t.Name == folderName);
  25. if (folder == null)
  26. return;
  27. context.Load(folder);
  28. context.ExecuteQuery();
  29. context.Load(
  30. folder,
  31. fields => fields.ListItemAllFields,
  32. fields => fields.ListItemAllFields.HasUniqueRoleAssignments,
  33. fields => fields.ListItemAllFields.RoleAssignments);
  34. context.ExecuteQuery();
  35. if (!folder.ListItemAllFields.HasUniqueRoleAssignments)
  36. {
  37. folder.ListItemAllFields.BreakRoleInheritance(true, true);
  38. context.ExecuteQuery();
  39. }
  40. Array.ForEach(accounts, account =>
  41. {
  42. account = account+"@"+<YourDomain>+".com";
  43. try
  44. {
  45. RoleDefinition def;
  46. //ForReadOnly
  47. def = web.RoleDefinitions.GetByName("Read");
  48. //ForContribute
  49. def = web.RoleDefinitions.GetByName("Contribute");
  50. RoleDefinitionBindingCollection rdb = new RoleDefinitionBindingCollection(context);
  51. rdb.Add(def);
  52. Principal usr = context.Web.EnsureUser(account);
  53. folder.ListItemAllFields.RoleAssignments.Add(usr, rdb);
  54. }
  55. catch (Exception ex)
  56. {
  57. WriteLogMessage(ex.Message);
  58. }
  59. });
  60. folder.Update();
  61. context.ExecuteQuery();
  62. }
And this is the code to remove permission.
  1. private static void RemovePersmissionFrom(params string[] accounts)
  2. {
  3. var DocumentLibName= "<YourDocumentLibraryName>"
  4. context = new ClientContext(webUrl);
  5. context.Credentials = new SharePointOnlineCredentials(userId, FetchPasswordFromConsole());
  6. Web web = context.Web;
  7. context.Load(web);
  8. context.ExecuteQuery();
  9. var web = WebSite;
  10. context.Load(web.Lists);
  11. context.ExecuteQuery();
  12. context.Load(web.SiteUsers);
  13. context.ExecuteQuery();
  14. context.Load(web.RoleDefinitions);
  15. context.ExecuteQuery();
  16. context.Load(web.RoleAssignments);
  17. context.ExecuteQuery();
  18. var list = web.Lists.OfType<List>().FirstOrDefault(l => l.Title.Equals(DocumentLibName, StringComparison.CurrentCultureIgnoreCase));
  19. context.Load(list);
  20. context.ExecuteQuery();
  21. //context.Load(items);
  22. context.Load(list.RootFolder);
  23. context.ExecuteQuery();
  24. context.Load(list.RootFolder.Folders);
  25. context.ExecuteQuery();
  26. var folderName = Path.GetFileName("Your folder Name");
  27. var folder = list.RootFolder.Folders.OfType<Folder>().FirstOrDefault(t => t.Name == folderName);
  28. if (folder == null)
  29. return;
  30. context.Load(folder);
  31. context.ExecuteQuery();
  32. context.Load(
  33. folder,
  34. fields => fields.ListItemAllFields,
  35. fields => fields.ListItemAllFields.HasUniqueRoleAssignments,
  36. fields => fields.ListItemAllFields.RoleAssignments);
  37. context.ExecuteQuery();
  38. if (!folder.ListItemAllFields.HasUniqueRoleAssignments)
  39. {
  40. folder.ListItemAllFields.BreakRoleInheritance(true, true);
  41. context.ExecuteQuery();
  42. }
  43. Array.ForEach(accounts, account =>
  44. {
  45. account = account+"@"+<YourDomain>+".com";
  46. try
  47. {
  48. web.EnsureUser(account);
  49. var user = web.SiteUsers.OfType<User>().FirstOrDefault(u => u.LoginName.Equals(account, StringComparison.CurrentCultureIgnoreCase));
  50. context.Load(user);
  51. context.ExecuteQuery();
  52. if (user != null)
  53. {
  54. var user_group = web.SiteUsers.GetByLoginName(user.LoginName);
  55. folder.ListItemAllFields.RoleAssignments.GetByPrincipal(user_group).DeleteObject();
  56. context.ExecuteQuery();
  57. }
  58. var def = web.RoleDefinitions.GetByName("Read");
  59. RoleDefinitionBindingCollection rdb = new RoleDefinitionBindingCollection(context);
  60. rdb.Add(def);
  61. Principal usr = context.Web.EnsureUser(account);
  62. folder.ListItemAllFields.RoleAssignments.Add(usr, rdb)
  63. }
  64. catch (Exception ex)
  65. {
  66. WriteLogMessage(ex.Message);
  67. HandleError(ex);
  68. }
  69. });
  70. folder.Update();
  71. context.ExecuteQuery();
  72. }
As mentioned above, we secured the password using SecureString and here is the code for that:
  1. private static SecureString FetchPasswordFromConsole()
  2. {
  3. string password = System.Configuration.ConfigurationSettings.AppSettings["Password"].ToString();
  4. Console.WriteLine();
  5. var securePassword = new SecureString();
  6. foreach (char c in password)
  7. securePassword.AppendChar(c);
  8. securePassword.MakeReadOnly();
  9. return securePassword;
  10. }

Hope this is useful.