Sharepoint Access拒绝RunWithElevatedPrivileges for SPFolder

时间:2016-04-13 08:14:38

标签: c# sharepoint

我尝试打开SPFolder时遇到“拒绝访问”错误,尽管我在SPSecurity.RunWithElevatedPrivileges中运行了代码。我找到了几个关于这个主题的帖子,我发现的解决方案是:

  • 不要使用SPContext.Current
  • RunWithElevatedPrivileges
  • 中实例化其中的SPObject
  • 设为false SPSecurity.CatchAccessDeniedException

对我来说没有任何作用。按照我的代码,错误发生在:

SPFolder DocumentLibrary = web.Folders[Library];

我的代码:

bool originalCatchValue = SPSecurity.CatchAccessDeniedException;
SPSecurity.CatchAccessDeniedException = false;

try
{
    string[] ArrayId = Request["arrayId"].ToString().Split('|');
    string company = Request["company"].ToString();
    string NewSPContext = company == "XXX" ? siteCollectionUrl.Replace("XXX", "") : siteCollectionUrl + "XXX";
    SPUserToken userToken = SPContext.Current.Web.CurrentUser.UserToken;
    foreach (string id in ArrayId)
    {
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            SPSite oSite = new SPSite(siteCollectionUrl, userToken);
            SPWeb oWeb = oSite.OpenWeb();
            SPFile itemFile = FindListByName(oWeb, Library).GetItemById(int.Parse(id)).File;
            using (SPSite site = new SPSite(NewSPContext, userToken))
            using (SPWeb web = site.OpenWeb())
            {
                var test = web.CurrentUser;
                web.AllowUnsafeUpdates = true;
                SPFolder DocumentLibrary = web.Folders[Library];
                DocumentLibrary.Files.Add(itemFile.Item.Name, itemFile.OpenBinary(), itemFile.Properties, true);
                DocumentLibrary.Update();
            }
        });
    }
    Response.Write("OK");
}
finally
{
    SPSecurity.CatchAccessDeniedException = originalCatchValue;
}

1 个答案:

答案 0 :(得分:0)

当您向SPSite类的构造函数提供用户标记时,创建的实例将在指定用户的上下文中运行。意思是,在您的情况下,您在oSite对象上执行的每个操作都将被执行,就像它被CurrentUser调用一样。

只需从实例化SPSite对象的行中删除用户令牌参数,您就可以开始使用,因为您的代码会提升权限。

话虽如此,您的代码存在多个问题。至少可以说,这是非常低效的,它不会通过代码审查。以下是一些提示:

  • 避免对RunWithElevatedPrivileges函数进行递归调用,这是一个非常昂贵的函数。

  • 尝试重新实例化SPSite和SPWeb对象,而不是在循环中递归地重新创建它们。它们构建起来非常昂贵。

  • 您必须处理SPSite和SPWeb对象的所有实例,否则最终会出现内存泄漏,这会导致应用程序性能随着时间的推移而恶化,最有可能导致最终崩溃。

    < / LI>