Вопрос

* *Разъяснение.Приложение == Определение сайта.Прямой доступ к базе данных невозможен ** Я создал приложение для SharePoint, в котором используются некоторые новые подходы к доступу списка кодирования.Я структурировал вещи таким образом, чтобы я мог точно контролировать взаимодействие данных.

Например, у меня есть класс Post, который имеет некоторые типичные метаданные, такие как заголовок, сводка и т. д.

Inside Post — это статический метод NewPost, который возвращает предварительно отформатированный SPListItem для использования при создании новых сообщений.

public static SPListItem NewPost(string Title,string Summary)
{
   Posts = CoreLists.Posts();
   var item = Posts.AddItem();
   var item["Alias"] = SPContext.Current.Web.CurrentUser.LoginName;
   return item;
}

Вы заметите, что я получаю SPList через вспомогательный класс CoreLists.

public static class CoreLists
{
   public static SPList Posts()
   {
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts");
   }
}

Это позволяет создать несколько хороших методов очистки данных.Я сталкиваюсь с тем, что не могу найти достойный способ вызвать эти методы с помощью SPSecurity.RunWithElevatedPrivileges

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

Я делаю это, потому что скрываю свои списки.Я хочу, чтобы люди имели к ним доступ только через пользовательский интерфейс, который я создаю.Я хочу еще больше заблокировать систему от взлома URL-адресов, разрешив создавать элементы только администраторам, и использовать SecurityBits, чтобы запретить редактирование элементов только создателям элементов списка.

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

Нужно ли мне переосмыслить весь уровень доступа к данным?Противоречит ли решение об ограничении доступа к спискам желанию создать более чистый уровень доступа к данным?

Это было полезно?

Решение

Вы используете SPContext.Current.Web внутри SPSecurity.RunWithElevatedPrivileges делегировать?

Это не сработает.Получать материал с SPContext предоставляет вам объекты, которые имеют контекст текущий зарегистрированный пользователь, а не тот, что повышен.Это означает, что если вы создадите новую запись списка, используя объекты, которые поступают из SPContext, они будут созданы в контексте безопасности пользователя, вошедшего в систему в данный момент, а не пользователя с повышенными правами, который, по вашему мнению, их создает.

Если вы хотите создавать записи списка с помощью sharepoint\system, вам необходимо открыть новые объекты SPSite / SPWeb внутри SPSecurity.RunWithElevatedPrivileges делегирует и работает с ними вместо этого.

Попробуйте изменить это:

   public static SPList Posts() 
   { 
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts"); 
   } 

к этому:

   public static SPList Posts() 
   { 
        using( var s = new SPSite(SPContext.Current.Site.ID)
        {
            using( var w = SPSite.OpenWeb(SPContext.Current.Web.ID)
            {
                 var postsList = w.Lists.TryGetList("Posts"); 
                 if( postsList != null )
                      return postsList;
                 else
                    /* do proper error handling */
            }
        }
    }

Теперь ваши записи.AddItem() должен создать записи списка с правильным повышенным контекстом.

Подробнее о повышении привилегий читайте в MSDN:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

Другие советы

Не используйте RWEP.Тебе это не нужно.

Скрытые списки не требуют специального кодирования для доступа.Если текущий пользователь имеет разрешения в список, то просто доступа к скрытому списку, как и любой другой список.

Если текущий пользователь не имеет разрешений в список, и вы хотите прокси уведомить обновление через код, вы должны осиливать системный счет.Кроме того, вы не должны проходить объект по границам безопасности.Я предлагаю создать объект передачи данных, который вы проходите в свой слой данных.

Vedrans Paint Re UI / Безопасность совершенно верна - если вы переписываете систему безопасности, вы работаете против зерна, как это было. Но Вы все равно хотите использовать преимущества безопасности (и другие преимущества SharePoint), поэтому нельзя полностью Manager, чтобы построить приложение на SharePoint.

Для более широкой архитектуры на основе SharePoint - используйте сайт публикации.Это дает вам:

  1. Стандартный интерфейс SharePoint UI для списков и т. Д. - Это представление admin 'Backstage'.
  2. Страницы Библиотека с отдельной главной страницей / ui - это интерфейс «приложения».

    по умолчанию (все аутентифицированные пользователи) получают доступ Viewer к сайту.Пользователи «admin» получают вкладчики / явные разрешения для списков, что угодно.

    Punters могут получить доступ только к данным сайта через пользовательские веб-частей / кода в интерфейсе приложения.

Вся ваша концепция неверна.

Если вы разрабатываете собственный пользовательский интерфейс и систему безопасности, то почему вы используете SharePoint?Использование SQL намного чище.

Каждый раз, когда вы используете SPSecurity.RunWithElevatedPrivileges в коде безопасность Sharepoint скомпрометирована, поскольку вы разрешаете текущему пользователю действовать как SHAREPOINT\System и иметь доступ ко всему.

Кстати, вы можете установить «создатель» при работе под SPSecurity.RunWithElevatedPrivileges

//First store current user
SPUser currentUser = SPContext.Current.Web.CurrentUser;

SPSecurity.RunWithElevatedPrivileges(delegate 
{
    using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
    using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
    {
       //Code to get your item or to add a new one

       // Replace 'System Account' with current user
       item["Author"] = currentUser;
       item["Editor"] = currentUser;
       item.SystemUpdate();
    }
});

ДОБАВЛЕНИЕ:

Чтобы избежать дальнейших неверных толкований:используя SQL, я имел в виду не базу данных SharePoint, а какую-то другую базу данных SQL.Почему?Поскольку вы используете собственный пользовательский интерфейс, настраиваемые проверки безопасности, ваш список скрыт (поэтому пользователи не могут использовать функции SP OOTB, такие как сортировка, фильтрация и т. д.), поиск также невозможен -> я действительно не вижу никаких преимуществ в использовании SharePoint. как хранилище данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top