2010-03-05 3 views
3

У меня есть веб-часть, которая обращается к объектной модели SP, упакованной в сборку, которая подписана и развернута в GAC. Web.config настроен для доверия «Полный», и все же моя веб-часть выбрасывает SecurityException. Нарушившая строка коды:trust set to Full, но веб-часть по-прежнему вызывает SecurityException

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

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

обновление: вот что код выглядел как прежде, чем я завернул его в методе 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 oject, вызывает исключение, включая метод RunWithElevatedPrivileges.

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

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

В любом случае, как я уже сказал, я до сих пор не знаю истинной причины исключения, поэтому ответы на эти строки по-прежнему приветствуются.

+2

Перемещение кода из конструктора веб-части помогло мне с аналогичной проблемой. Спасибо за обновление вопроса. –

+0

Кто-нибудь знает, почему это происходит из конструктора? – xdhmoore

ответ

2

Проблема может возникнуть, если вы попытаетесь работать с объектами 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 ... 
      } 
     }); 
    } 

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

+0

обновил OP. –