вторник, 17 июля 2012 г.

LinqToSharePoint & RunWithElevatedPriveledges

Итак проблема

SPSecurity.RunWithElevatedPriveledges игнорируется при использовании команд LinqToSharePoint, так как для выполнения команд в любом случае берется текущий контекст, SPContext.Current, если он не пуст. И только если мы выполняем команды вне веб-контекста, он сформирует контекст из наших данных.

Проблема решается, путем  «подсовывания» текущему контексту, того Web данных, который мы используем внутри RunWithoutPriveledges.

Делается это так:

1)      Запоминаем текущий веб-контекст
2)      Выполняем RunWithoutPriveledges
3)      Внутри открываем Site и Web
4)      Ассоциируем текущий контекст с новым Web
5)      Открываем DataContext LinqToSharePoint
6)      Выполняем все команды с повышенными правами
7)      Закрываем Web и Site
8)      Восстанавливаем веб-контекст из п.1


Техническая реализация описана в этой ссылке:




Вот класс-обертки для вызова
public class LinqToSPSecurity
{
  public static void RunWithElevatedPriveledges(SPWeb web, Action<SPWeb> action) 
  {
    Guid webId = web.ID;
    Guid siteId = web.Site.ID;

    HttpContext backupCtxt = HttpContext.Current;
    try
    {
      if (SPContext.Current != null)
        HttpContext.Current = null;
      SPSecurity.RunWithElevatedPrivileges(() =>
      {
        using (SPSite elevatedSite = new SPSite(siteId))
        {
          using (SPWeb elevatedWeb = elevatedSite.OpenWeb(webId))
          {
            HttpRequest httpRequest = new HttpRequest("", elevatedWeb.Url, "");
            HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new System.IO.StringWriter()));
            SPControl.SetContextWeb(HttpContext.Current, elevatedWeb);
            action(elevatedWeb);
          }
        }
      });
    }
    finally
    {
      if (SPContext.Current != null)
        HttpContext.Current = backupCtxt;
    }

  }

  public static void RunWithElevatedPriveledges(Action<SPWeb> action) 
  {
    RunWithElevatedPriveledges(SPContext.Current.Web, action);
  }
}

0 коммент.:

Отправить комментарий