SharePoint RoleAssignment将不会添加

时间:2011-10-19 21:50:49

标签: .net vb.net sharepoint sharepoint-2007

我正在尝试对文档库中的文件夹操作SPListItem权限,但我似乎无法添加任何新权限,但删除安全继承可以很好地工作。

我已尽力为测试目的创建代码的精简版本。函数GetListItem根据URL返回我们正在使用的SPListItem。 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的调用中,并且我还有其他代码可以使用此现有代码查找/删除/更新文件夹/ etc等属性。只是权限不想工作。

参考文献:
  - http://moldenco.blogspot.com/2007/05/spsecurityrunwithelevatedprivileges-to.html
  - How to give an SPGroup permissions for an SPItem?
  - http://blogs.msdn.com/b/joelo/archive/2007/10/05/sharepoint-roles-assignments.aspx

2 个答案:

答案 0 :(得分:0)

通过研究问题并尝试各种不同的方法,我遇到了异常,“由于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仍然与您的非提升帐户有关联,并通过将其设置为null来解决问题。

答案 1 :(得分:0)

试试这样。如果由于权限仍然遇到这些方法的问题,请尽量不使用提升的权限,而是模仿。我在下面的权限方法中发布了一个方法:

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