Разрешения на разработку SharePoint - PullRequest
2 голосов
/ 20 февраля 2009

Привет! Я использую пространство имен SharePoint для извлечения элементов из различных списков по всему сайту. Моя веб-часть работает, но только на моем аккаунте. Когда я пытаюсь сделать это на другом аккаунте, на странице появляется сообщение «Ошибка: доступ запрещен». Я удалил все веб-части, и на этой странице есть только эта веб-часть. Когда я удаляю следующие строки, страница загружается для всех, когда я добавляю ее обратно, однако она не работает. Я предполагаю, что это какая-то проблема с разрешением. Мне было интересно, есть ли возможность программно запрашивать разные списки в SharePoint, назначая идентификатор пользователя для использования? Спасибо за любую помощь

...
SPSite site = new SPSite(_SPSite);           
SPWeb eachWeb = site.AllWebs[0];
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items;
...

Ответы [ 4 ]

4 голосов
/ 20 февраля 2009

Вы правы, ошибка отказа в доступе возникает, когда вы используете учетную запись, у которой нет доступа к списку "Списки" на текущем веб-сайте.

Самый простой способ обойти эту проблему - использовать вызов SPSecurity.RunWithElevatedPrivleges:

SPSecurity.RunWithElevatedPrivleges(delegate()
{
     //Your code here
});

, который будет запускать любой код, содержащийся в анонимном методе, используя учетную запись SharePoint / System, предоставляя полный контроль. Будьте осторожны при использовании этого метода, поскольку он эквивалентен запуску кода с полным доверием с учетной записью суперпользователя. Есть также другие предостережения , о которых также следует знать.

0 голосов
/ 23 февраля 2009

Вы не должны жестко кодировать имя сервера в этом случае, потому что ваше требование состоит в том, чтобы извлечь элементы из списка на том же сайте, что и ваша веб-часть. Вы правы, если у вас недостаточно прав для вашей учетной записи, то вы получите Отказ в доступе. Решение состоит в том, чтобы создать новый объект SPSite в другом контексте безопасности и выполнить свою работу:

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        using (SPSite site = new SPSite(SPContext.Current.Site.Url))
        {
            using (SPWeb web = site.OpenWeb())
            {
                //the web object was retrieved with elevated privileges under the system account.

                //do your work here:
                SPListItemCollection myItemCollection = web.Lists["Listings"].Items;

                //...
            }
        }
    }
    );

С помощью приведенного выше кода ваша веб-часть является переносимой, поскольку отсутствует жесткое кодирование, и выполняется в правильном контексте безопасности при удалении всех неуправляемых объектов SPRequest, созданных конструкторами SPSite и SPWeb.

0 голосов
/ 23 февраля 2009

Что касается первого предупреждения от EvilGoatBob, я цитирую:

"Если вы манипулируете какими-либо элементами объектной модели внутри вашего повышенного метода, вам нужно получить свежую ссылку SPSite внутри этого вызова. Например,

SPSecurity.RunWithElevatedPrivileges(delegate(){
   SPSite mySite = new SPSite(http://sharepoint/);
   SPWeb myWeb = SPSite.OpenWeb();
   // further implementation omitted
});"

Обратите внимание, что параметр сайта жестко запрограммирован - это из-за ошибки. Если бы вы попытались:

с использованием (сайт SPSite = новый сайт SPSite ("http://" + System.Environment.MachineName)) {}

Вы получите довольно типичную ошибку «Нет сайта SharePoint по указанному URL ...». Это вызвало у меня бесконечное горе. Суть в том, что вы должны жестко прописать имя сервера (если у кого-то нет альтернативы). Вы также можете получить подобное сообщение об ошибке при первой отладке веб-частей с помощью VSeWSS 1.3.

0 голосов
/ 20 февраля 2009

Попробуйте:

SPWeb eachWeb = SPContext.Current.Site.RootWeb.Webs[0];
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items;

Помните, что SPWeb следует использовать в блоке using или утилизировать явно после использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...