C# - Как установить разрешения SharePoint для пользователя на дочернем сайте, а не на уровне root

Я пытаюсь добавить разрешения для пользователя, который находится в дочернем сайте в SharePoint. Мне удалось успешно установить разрешения для пользователя на корневом уровне, но я не уверен, как решить проблему для дочернего сайта более низкого уровня. Ниже приведено то, что у меня есть в данный момент, но оно вылетает, хотя не показывает ошибок при сборке в VS. Любые идеи будут великолепны

        foreach (SPWeb subSite in spSite2.RootWeb.GetSubwebsForCurrentUser())
        {
            if (subSite.Name == "templates")
            {
                Console.WriteLine("\nTEMPLATES SITE");
                Console.Write("\nApplying 'Read' permission to App_user Account");
                spRoleAssignment = new SPRoleAssignment(SPContext.Current.Web.Users[appUserAccount]);
                spRoleAssignment.RoleDefinitionBindings.Add(SPContext.Current.Web.RoleDefinitions["Read"]);
                SPContext.Current.Web.RoleAssignments.Add(spRoleAssignment);
                SPContext.Current.Web.Update();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.CursorLeft = Console.BufferWidth - 16; Console.WriteLine("Applied");
                Console.ForegroundColor = ConsoleColor.Gray;
            }
        }

2 ответа

Решение

Я не совсем уверен, чего вы пытаетесь достичь, и где ваш код должен выполняться (консольное приложение или задание таймера или веб-часть?).

Я вижу следующие проблемы:

  1. Вы входите в консоль (что позволяет предположить, что ваш код выполняется в консольном приложении), но вы получаете доступ к SPContext.Current, который доступен только в том случае, если ваш код выполняется в HTTP-запросе.

  2. Вы перебираете коллекцию веб-сайтов. Но в вашем теле для каждого SPContext.Current.Web обновляется.

  3. Вы получаете свою веб-коллекцию через web.GetSubwebsForCurrentUser(), но затем меняются разрешения на эти объекты. Это немного пахнет, так как обновление прав - это "задача администратора" и метод GetSubwebsForCurrentUser скорее всего будет использоваться для низкоуровневого пользовательского контекста, чтобы избежать исключения отказа в доступе. Например, для безопасного отображения списка веб-сайтов.

  4. Вы обновляете разрешения / роли в сети, но отсутствует проверка наличия в сети уникальных назначений ролей.

  5. Вы проверяете сеть с именем "шаблоны". поскольку GetSubwebsForCurrentUser не является рекурсивным, в этой коллекции может быть только одна сеть с именем "шаблоны". Эта сеть может быть открыта direclty => нет необходимости тратить ресурсы, открывая каждую суб-сеть.

Если ваша задача состоит в том, чтобы установить разрешения ролей для определенных веб-шаблонов (которые являются подуровнем 1-го уровня вашей корневой сети), вы можете использовать следующий код:

// Open the web directly since it is a direct child of the site collection.
// Use a using to properly release the resources
using (SPWeb web = spSite2.Open("templates"))
{
  SPUser user = web.SiteUsers[appUserAccount];
  SPRoleDefinition roleDef = web.RoleDefinitions.GetByType(SPRoleType.Reader);

  if (!web.HasUniqueRoleAssignments)
  {
    web.BreakRoleInheritance(true);
  }

  spRoleAssignment = new SPRoleAssignment(user);
  spRoleAssignment.RoleDefinitionBindings.Add(roleDef);
  web.RoleAssignments.Add(spRoleAssignment);

  // No need to update the web when changing the permissions
}

Попробуйте обновить роли в подсайте, а не в текущем веб-сайте из SPContext?

AFAIK каждый объект SPWeb имеет свои собственные назначения ролей.

Другие вопросы по тегам