【问题标题】:Sharepoint query with elevated privileges具有提升权限的共享点查询
【发布时间】:2011-08-27 22:48:19
【问题描述】:

Webpart 需要访问 Sharepoint 列表(读取模式)。如果用户是管理员,则没有问题(按预期工作),但如果用户没有访问权限,我必须使用“RunWithElevatedPrivileges”方法。

问题是查询似乎没有返回正确的结果。我错过了什么?

        SPList demoList = null;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            SPSite oSite = SPControl.GetContextSite(HttpContext.Current); // ADDED
            SPWeb oWeb = oSite.OpenWeb();                                 // ADDED
            demoList = oWeb.Lists["nameList"];
        });
        // demoList has 3 Elements (admin and no admin user) OK

        SPListItemCollection collListItems = null;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            SPQuery oQuery = new SPQuery() { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" };
            collListItems = demoList.GetItems(oQuery);
        });

        // 
        //IF ADMIN
        //collListItems.Count ==>3

        //IF NO ADMIN 
        //collListItems.Count ==>0

【问题讨论】:

    标签: sharepoint sharepoint-2010 web-parts elevated-privileges


    【解决方案1】:

    如果您想在 SharePoint 列表中包含写入操作,请在 RWEP 方法之前添加 SPWeb.ValidateFormDigest()SPUtility.ValidateFormDigest() 行。

    SPUtility.ValidateFormDigest();
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
    
    }
    

    【讨论】:

      【解决方案2】:

      如果您在提升的块之外创建站点和 Web 对象(或从当前 SPContext 访问它们),它们将拥有当前登录用户的权限。因此,您的查询,即使它位于提升的块中,也没有使用提升的权限。您需要在提升的块内创建新的站点和 Web 对象,然后访问列表,然后运行查询以获得预期的结果。

      这是进一步解释的资源。即使它是为 SharePoint 2007 完成的,它也适用于 SharePoint 2010。

      在 Windows SharePoint Services 3.0 中运行具有提升权限的命令 http://msdn.microsoft.com/en-us/library/bb466220(v=office.12).aspx

      【讨论】:

      • 谢谢,但我添加了网站和 SpWeb(代码已编辑),但仍然无法正常工作。
      • 您正在从上下文中获取 SPSite 对象,因此它仍然附加了当前用户的凭据。您需要更新它才能获得提升的权限。
      • 另外请注意,您在一个块中创建提升的 SPList 对象,然后在另一个块中使用它。这可能有效(我自己从未尝试过),但我认为将两个高架块合二为一会更好(正如 JWL 所建议的那样)。
      【解决方案3】:

      您需要创建具有提升权限的新对象。

      SPSecurity.RunWithElevatedPrivileges(delegate()
      {
          SPSite oSite = new SPSite(SPContext.Current.Site.ID); 
          SPWeb oWeb = oSite.OpenWeb(SPContext.Current.Web.ID);                                 
          demoList = oWeb.Lists["nameList"];
      });
      

      此外,您应该处置新创建的对象,并且不需要两个委托。

      SPSecurity.RunWithElevatedPrivileges(delegate {
          using (SPSite oSite =new SPSite(SPContext.Current.Site.ID))
          using (SPWeb oWeb = oSite.OpenWeb()) {
              var demoList = oWeb.Lists["nameList"];
              SPQuery oQuery = new SPQuery
                                  { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" };
              SPListItemCollection collListItems = demoList.GetItems(oQuery);
      
              //IF ADMIN
              //collListItems.Count ==>3
      
              //IF NO ADMIN 
              //collListItems.Count ==>0
          }
      });
      

      【讨论】:

      • 注意:RunWithElevatedPrivileges 块中的“泄漏”对象(如返回 SPList)可能会导致以后出现非功能代码或意外的特权提升。请确保您不会从传递给 RunWithElevatedPrivileges 的委托中返回 SPxxxx 对象(或确保对象中的所有数据都已可用)。请注意,返回 LINQ 查询的结果可能会将执行延迟到稍后时间,并因此在 RunWithElevatedPrivileges 调用之外执行 SharePoint 调用。
      猜你喜欢
      • 2011-08-27
      • 2013-01-19
      • 2016-01-17
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多