Как работать с повышенными привилегиями на странице приложения?
-
16-10-2019 - |
Вопрос
Я хочу получить элемент списка, к которому у текущего пользователя нет доступа, но мне нужно получить его в коде. Когда я использую SPSecurity.RunWithElevatedPrivileges
это не работает.
Это потому, что я использую веб -объект текущего контекста на странице приложения.
Если я хочу заставить код работать, я должен построить еще один объект SPSite и Spweb в RunWithElevatedPrivileges
делегат, но я не хочу этого делать.
Как я могу достичь этого, используя текущий веб -контекст на странице приложения?
Решение
Вы должны создать создание новых объектов SPSITE и SPWEB внутри вашего делегата runWitelevatedPrivileges (), используя свойства идентификации объектов SPSITE и SPWEB текущего контекста:
Guid siteId = SPContext.Current.Site.ID;
Guid webId = SPContext.Current.Web.ID;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(siteId))
{
using (SPWeb web = site.OpenWeb(webId))
{
// Your code here
}
}
});
Могу я спросить, почему вы «не хотите» создавать новые объекты SPSite и Spweb в своем делегате RunWitelevatedPrivileges ()? Если вы используете шаблон дизайна, который я продемонстрировал выше, вам не нужно беспокоиться о вызове Dispose () на новых объектах, которые вы создали.
Другие советы
Спасибо, это очень помогло нам много времени. Отличный ответ :)
Из Spsecurity.runwitelevatedprivileges:
«Объект SPSITE, созданный вне делегата, может быть упомянут внутри делегата, однако, методы и оценщики свойств объекта, работающие с привилегиями пользовательского контекста, в котором были созданы объекты, а не с повышенными привилегиями».
В основном вы должен Создайте новые объекты внутри делегата, чтобы выполнить с полным контролем.
Вы должны создать новый SPSite внутри SPSecurity.RunWitelevatedPrivileges, используя либо URL, либо GUID.
Для подробной информации о spsecurity.runwitelevatedprivileges и других методах олицетворения, проверьте это: