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 ответа
Я не совсем уверен, чего вы пытаетесь достичь, и где ваш код должен выполняться (консольное приложение или задание таймера или веб-часть?).
Я вижу следующие проблемы:
Вы входите в консоль (что позволяет предположить, что ваш код выполняется в консольном приложении), но вы получаете доступ к
SPContext.Current
, который доступен только в том случае, если ваш код выполняется в HTTP-запросе.Вы перебираете коллекцию веб-сайтов. Но в вашем теле для каждого
SPContext.Current.Web
обновляется.Вы получаете свою веб-коллекцию через
web.GetSubwebsForCurrentUser()
, но затем меняются разрешения на эти объекты. Это немного пахнет, так как обновление прав - это "задача администратора" и методGetSubwebsForCurrentUser
скорее всего будет использоваться для низкоуровневого пользовательского контекста, чтобы избежать исключения отказа в доступе. Например, для безопасного отображения списка веб-сайтов.Вы обновляете разрешения / роли в сети, но отсутствует проверка наличия в сети уникальных назначений ролей.
Вы проверяете сеть с именем "шаблоны". поскольку
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 имеет свои собственные назначения ролей.