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;

Большое спасибо!

Другие вопросы по тегам