Назначение роли SharePoint не будет добавлено - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь манипулировать разрешениями SPListItem для папок в библиотеке документов, но не могу добавить какие-либо новые разрешения, хотя удаление наследования безопасности работает прекрасно.

Я приложил все усилия, чтобы создать уменьшенную версию кода для целей тестирования. Функция GetListItem возвращает SPListItem, с которым мы работаем, на основе URL. item.BreakRoleInheritance(False) прекрасно работает, и я проверил, правильно ли нарушает наследование и удаляет все разрешения, я также попробовал его с флагом True и проверил, что все исходные разрешения скопированы из родительского.

Приведенный ниже код не выдает никаких исключений, и, насколько я могу судить, работает нормально, пока я не проверю фактические разрешения для папки в моей библиотеке документов и не увижу, что «Зрители» не указаны.

Код:

    Dim item As SPListItem = GetListItem(URL)

    If item Is Nothing Then
        Exit Sub
    End If

    Dim spGrp = SharePointWeb.SiteGroups("Viewers")
    Dim spRole As SPRoleDefinition = SharePointWeb.RoleDefinitions("Read")

    Dim roleAssignment As New SPRoleAssignment(spGrp)
    roleAssignment.RoleDefinitionBindings.Add(spRole)

    SharePointWeb.AllowUnsafeUpdates = True

    item.BreakRoleInheritance(False)
    item.RoleAssignments.Add(roleAssignment)
    item.Update()

    SharePointWeb.AllowUnsafeUpdates = False

Я пытался обернуть этот код в вызов SPSecurity.RunWithElevatedPrivileges, но это не имело никакого значения. Создание моих объектов SPSite / SPWeb обернуто в вызов SPSecurity.RunWithElevatedPrivileges, и у меня есть другой код, который выполняет / находит / удаляет / обновляет атрибуты в папках / и т. Д. С этим существующим кодом; просто разрешения не хотят работать.

Ссылки:
- http://moldenco.blogspot.com/2007/05/spsecurityrunwithelevatedprivileges-to.html
- Как дать разрешения SPGroup для SPItem?
- http://blogs.msdn.com/b/joelo/archive/2007/10/05/sharepoint-roles-assignments.aspx

Ответы [ 2 ]

0 голосов
/ 02 ноября 2011

попробуй вот так. Если у вас все еще есть проблемы с этими методами из-за разрешений, старайтесь не использовать привилегированные права, а выдавать себя за другого. Я разместил метод для этого ниже методов разрешения:

 public static void SetPermissions(SPListItem item, IEnumerable<SPPrincipal> principals)
        {
            try
            {
                if (item != null)
                {
                    foreach (SPPrincipal principal in principals)
                    {
                        SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute];
                        SetPermissions(item, principal, roleDefinition);
                    }
                }
            }
            catch (SPException exc)
            {
                //catch exception
            }
        }

        /// <summary>
        /// setpermissions method for one group
        /// </summary>
        /// <param name="item"></param>
        /// <param name="principal"></param>
        /// <param name="roleType"></param>
        public static void SetPermissions(SPListItem item, SPPrincipal principal)
        {
            if (item != null)
            {
                SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute];
                SetPermissions(item, principal, roleDefinition);
            }
        }

        /// <summary>
        /// permission setting method used by previous two setpermissions method
        /// </summary>
        /// <param name="item"></param>
        /// <param name="principal"></param>
        /// <param name="roleDefinition"></param>
        public static void SetPermissions(SPListItem item, SPPrincipal principal, SPRoleDefinition roleDefinition)
        {

            if (item != null)
            {
                item.Web.AllowUnsafeUpdates = true;

                SPRoleAssignment roleAssignment = new SPRoleAssignment(principal);
                roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
                item.RoleAssignments.Add(roleAssignment);

                item.Web.AllowUnsafeUpdates = false;
            }

        }

методы олицетворения:

public static SPWeb GetImpersonatedWeb(SPSite impSite, string impWebUrl)
        {
        ILogger logger = SharePointServiceLocator.GetCurrent().GetInstance<ILogger>();

        try
        {
            SPUserToken systoken = impSite.SystemAccount.UserToken;
            using (SPSite site = new SPSite(impSite.Url, systoken))
            {
                SPWeb web = site.AllWebs[GetServerRelUrlFromFullUrl(impWebUrl)];
                return web;
            }
        }
        catch (SPException exc)
        {
            //catch exception
        }
    }

    public static SPSite GetImpersonatedSite()
    {
        try
        {
            SPSite impSite = SPContext.Current.Site;

            SPUserToken systoken = impSite.SystemAccount.UserToken;
            SPSite site = new SPSite(impSite.Url, systoken);
            return site;
        }
        catch (SPException exc)
        {
            //catch exception
        }
    }

public static string GetServerRelUrlFromFullUrl(string url)
        {
        int index = url.IndexOf("//");
        if ((index < 0) || (index == (url.Length - 2)))
        {
            throw new ArgumentException();
        }
        int startIndex = url.IndexOf('/', index + 2);
        if (startIndex < 0)
        {
            return "/";
        }
        string str = url.Substring(startIndex);
        if (str.IndexOf("?") >= 0)
            str = str.Substring(0, str.IndexOf("?"));

        if (str.IndexOf(".aspx") > 0)
            str = str.Substring(0, str.LastIndexOf("/"));

        if ((str.Length > 1) && (str[str.Length - 1] == '/'))
        {
            return str.Substring(0, str.Length - 1);
        }
        return str;
    }
0 голосов
/ 21 октября 2011

Изучив проблему и попробовав множество различных методов, я наткнулся на исключение: «Операция недопустима из-за текущего состояния объекта», которая произошла в SPWebEnsureSPControl.нашел это сообщение на форуме http://social.msdn.microsoft.com/forums/en-US/sharepointdevelopment/thread/32869ac6-4f47-46b8-accf-f56966ac9581, что привело меня к изменению моего кода.Я сделал System.Web.HttpContext.Current = Nothing первую строку кода после вызова SPSecurity.RunWithElevatedPrivileges, и все начало работать.

Так что мой код выглядит примерно так (с использованием автономного делегата):

    SPSecurity.RunWithElevatedPrivileges(Sub()
                                             System.Web.HttpContext.Current = Nothing
                                             ........
                                         End Sub)

Из чегоЯ прочитал, что System.Web.HttpContext.Current все еще имеет соединения с вашей учетной записью без повышенных прав, и установив ее на ноль, это избавит от проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...