Добавление в список Sharepoint в качестве анонимного пользователя - PullRequest
0 голосов
/ 17 ноября 2011

Сейчас я использую метод SPSecurity.RunWithElevatedPrivileges, чтобы позволить анонимным пользователям добавлять элементы списка в список. То, что я хотел бы сделать, это сделать общий метод, который принимает в качестве аргумента объект «Сайт», «Список» и «Список» и добавляет этот элемент в передаваемый список. Прямо сейчас у меня есть:

public static void AddItemElevated(Guid siteID, SPListItem item, SPList list)
{
    SPSite mySite = SPContext.Current.Site;
    SPList myList = WPToolKit.GetSPList(mySite, listPath);
    SPWeb myWeb = myList.ParentWeb;
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        using (SPSite eleSite = new SPSite(mySite.ID))
        {
            using (SPWeb eleWeb = eleSite.OpenWeb(myWeb.ID))
            {
                eleWeb.AllowUnsafeUpdates = true;
                SPList eleList = eleWeb.Lists[myList.Title];
                SPListItem itemToAdd = list.Items.Add();
                itemToAdd = item;
                itemToAdd.Update();
                eleWeb.AllowUnsafeUpdates = false;
            }

        }
    });
}

Проблема в том, что «item» инициализируется за пределами повышенных привилегий, поэтому, когда для «itemToAdd» установлено значение «item», он теряет свои повышенные привилегии, что приводит к сбою кода в «item.update ()», если используется my непривилегированный пользователь.

Есть мысли?

Ответы [ 4 ]

0 голосов
/ 17 ноября 2011

Если item поступает из метода SPList.AddItem (), экземпляр списка должен быть получен из сети с повышенными правами. в противном случае этот код всегда будет нарушен для анонимных пользователей.

или вы можете разрешить анонимному пользователю добавлять элементы в список, поэтому вам не нужно запускать код с повышенными привилегиями.

Кстати,

, itemToAdd = item; - это неправильный способ установки нового добавленного элемента на старый экземпляр.

0 голосов
/ 17 ноября 2011

Следующая строка itemToAdd = item; делает что-то странное - вы добавляете элемент в один список (с list.Items.Add()), но обновляете элемент из другого списка / местоположения (с аргументом).

Не уверен, что вына самом деле, но, возможно, вы хотите скопировать все файлы из item в itemToAdd.В этом случае рассмотрите возможность передачи пар fieldName / value в качестве аргумента, чтобы было ясно, что вы добавляете новый элемент с заданными значениями.

Обратите внимание, что анонимные пользователи могут добавлять элементы в списки, которые явно разрешают это.

0 голосов
/ 17 ноября 2011

Я не пробовал, но, возможно, это могло бы помочь - http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.copyto.aspx

С уважением, Нитин Растоги

0 голосов
/ 17 ноября 2011

Возможно, проблема в том, что вы переходите в свой список.Попробуйте просто передать имя списка, а затем получить список из расширенного веба, например:

public static void AddItemElevated(SPListItem itemToAdd, string listName)
{  
  SPWeb web = SPContext.Current.Web;

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        using (SPSite elevatedSite = new SPSite(web.Url))
        {
            using (SPWeb elevatedWeb = elevatedSite.OpenWeb())
            {
                elevatedWeb.AllowUnsafeUpdates = true;
                SPList list = elevatedWeb.Lists[listName];
                SPListItem item = list.Items.Add();
                item = itemToAdd;
                item.Update();
                elevatedWeb.AllowUnsafeUpdates = false;
            }
        }
    }
}
...