SPListItem.Update создает исключение UnauthorizedAccessException для пользователя, прошедшего проверку подлинности с помощью форм
Я пытаюсь исправить некоторый код (который я не написал), который вставляет элемент в список SharePoint. Проблема заключается в том, что код работает для анонимных пользователей, но если пользователь вошел в систему с помощью проверки подлинности на основе форм ASP.NET, при вызове метода Update объекта SPListItem он получает исключение UnauthorizedAccessException. Когда он работает как анонимный пользователь, я вижу, что SPUser SPLebItem SPLeb является системной учетной записью SharePoint. Но когда пользователь вошел в систему с помощью проверки подлинности с помощью форм, SPUser имеет значение null. Может кто-нибудь объяснить это поведение и как это исправить?
Первоначально в делегате RunWithElevatedPrivileges был только верхний блок кода, но я попытался переместить все это внутрь. Я вставлю некоторые использующие блоки, как только у меня получится:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
rootWeb = SPContext.Current.Site.RootWeb;
rootWeb.AllowUnsafeUpdates = true;
currentWeb = SPContext.Current.Web;
currentWeb.AllowUnsafeUpdates = true;
try
{
// Get site information
SPList franDir = rootWeb.GetList("/Lists/Directory");
SPQuery query = new SPQuery();
query.Query = "<Where><Eq><FieldRef Name='Subsite'/><Value Type='Text'>" + currentWeb.Name +
"</Value></Eq></Where>";
SPListItemCollection items = franDir.GetItems(query);
SPList l = rootWeb.GetList("/Lists/Request");
SPListItem li = l.Items.Add();
li["Location"] = siteName;
//...set more fields
li.Update();
}
catch (Exception ex)
{
rootWeb.Dispose();
logger.ErrorException("An error occured adding item", ex);
throw ex;
}
rootWeb.Dispose();
});
1 ответ
Благодаря @AlexeiLevenkov я вижу, что это не работает, потому что я использую существующий экземпляр объектов SP, которые были созданы с использованием привилегий по умолчанию. Как доказательство того, что код ничего не делает, при запуске в качестве анонимного пользователя код успешно выполняется даже без вызова RunWithElevatedPrivileges. Я сделал это изменение, и оно позаботилось об этом.
SPSecurity.RunWithElevatedPrivileges(delegate()
{
rootWeb = new SPSite(SPContext.Current.Site.ID).RootWeb;
Большое спасибо!