доверие установлено на Полный, но веб-часть все еще вызывает исключение SecurityException - PullRequest
3 голосов
/ 05 марта 2010

У меня есть веб-часть, которая обращается к объектной модели SP, упакованная в сборку, которая подписана и развернута в GAC.Для web.config установлено «Полное» доверие, но моя веб-часть выдает SecurityException.Обидные строки кода:

SPSecurity.RunWithElevatedPrivileges(new SPSecurity.CodeToRunElevated(() =>
{
    foreach (SPGroup g in user.Groups)
    {
        identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\"));
    }
}));

Похоже, что исключение выдается при вызове RunWithElevatedPrivileges (другими словами, мой делегат вообще не выполняется).Есть идеи?Я полностью сбит с толку.

update : вот как выглядел код, прежде чем я обернул его в метод RunWithElevatedPrivileges:

public MyWebPart()
{            
    context = new MyProject.Data.MyDataContext(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString);
    SPUser user = SPContext.Current.Web.CurrentUser;
    identity = String.Format("'{0}'", user.LoginName.ToLowerInvariant().Replace(@"\", @"\\"));
    foreach (SPGroup g in user.Groups)
    {
        identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\"));
    }            

    identity = '[' + identity + ']';
}

И исключение:

System.Security.SecurityException occurred
  Message="Request failed."
  Source="Microsoft.SharePoint"
  StackTrace:
       at Microsoft.SharePoint.SPBaseCollection.System.Collections.IEnumerable.GetEnumerator()
       at MyProject.MyWebPart..ctor()
  InnerException: 

Судя по выделению, предоставленному помощником исключения, похоже, что попытка доступа к свойству SPUser.Groups является проблемой: user.Groups.

Что меня действительно поразилосмущает то, что этот точный код работал нормально два дня назад, но у меня были некоторые другие проблемы с фермой, и в основном пришлось ее перестраивать.После того, как все остальное было восстановлено, я пошел и попытался добавить эту веб-часть на страницу, и эта проблема проявилась.Я попытался обернуть код в оболочку RunWithElevatedPrivileges, чтобы посмотреть, смогу ли я выделить именно тот бит, который нарушен, но похоже, что все, что касается модели объекта SP, вызывает исключение, включая метод RunWithElevatedPrivileges.

update2 : Я до сих пор не знаю реальной причины, по которой это не помогло, но это происходило, когда я пытался добавить веб-часть.После установки точек останова в отладчике я понял, что конструктор вызывался дважды;в первый раз все работало в точности так, как ожидалось, но во второй раз было сделано исключение.Я до сих пор понятия не имею, почему.Я нашел два способа обойти это: переместить нарушающий код из конструктора в более позднюю точку жизненного цикла веб-части или закомментировать код, чтобы добавить веб-часть, затем раскомментировать и повторно развернуть.

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

1 Ответ

2 голосов
/ 05 марта 2010

Проблема может возникнуть, если вы попытаетесь работать с объектами SharePoint, которые были созданы вне метода RunWithElevatedPrivileges () и поэтому по-прежнему содержат их старый контекст безопасности. В вашем случае вы используете объект SPUser, который не был создан в методе RunWithElevatedPrivileges ().

Чтобы обойти это, вы должны создать объект, с которым вы хотите работать, внутри делегата. Безопасные идентификаторы или URL-адреса вне делегата, чтобы использовать их для воссоздания объектов. Например: сохраните URL-адрес или идентификатор объекта SPSite и используйте его для повторного создания в делегате.

 public void Demo()
 {
      string  siteURL = SPContext.Current.Site.Url;
      SPSecurity.RunWithElevatedPrivileges(delegate(){

          using (SPSite safeSite = new SPSite(siteURL))
          {
             // place your code here ... 
          }
      });
  }

Возможно, вы могли бы опубликовать трассировку стека, чтобы мы могли получить больше информации.

...