Могут ли обычные пользователи обновлять настройки SPPersistedObject, если они выполняются с повышенными привилегиями?

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/93794

Вопрос

У меня есть собственный значок ленты «Зачислить», развернутый в каждой библиотеке документов.Нормальный (т.не являющийся администратором) пользователь может щелкнуть этот значок;когда он это сделает, я хотел бы где-нибудь навсегда сохранить информацию о библиотеке документов (идентификатор, имя).Затем центральный администратор может (через настраиваемую страницу центрального администратора) просмотреть список всех библиотек документов, зарегистрированных пользователями.

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

// Execute this code when a ribbon icon is clicked by a normal user
SPSecurity.RunWithElevatedPrivileges(delegate()
{
    // Write DocumentLibrary Id and Name to some custom SPPersistedObject
});

MSDN говорит, что RunWithElevatedPrivileges() «Запускается в рамках идентификации пула приложений, в котором есть привилегии администратора сбора сайтов во всех коллекциях сайтов, размещенных в этом пуле приложений». Этого достаточно, чтобы обновить SPPersistedObject?

Должен ли я отменить SPPersistedObject.HasAdditionalUpdateAccess всегда возвращать true, или этого все равно будет недостаточно для наименее привилегированных сред?Если нет, какие варианты хранения такой информации, кроме пользовательской базы данных, у меня есть?

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

Решение

Повышенные привилегии недостаточно для записи в базу данных конфигурации.Благодаря повышенным привилегиям вы будете использовать Identitty Pool Apply Application, который по умолчанию имеет разрешение на чтение только для конфигурации DB.Конечно, пользователь администратора (который запускает центральный администратор должен иметь разрешения для чтения и записи).

Подробнее см.: http://joelblogs.co.uk/2010/10/10/persisting-configuration-data-in-sharepoint-2010-with-sppersistedobject/

SPPersistedObject.HasAdditionalUpdateAccess

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

И последняя тема, которая требует некоторого освещения, — это безопасность.Как описано ранее, HOS существует в базе данных конфигурации фермы.Строго говоря, он существует для поддержки административной функциональности, однако он имеет использование за пределами этой области.Например, если мы создаем пользовательскую работу таймера, и мы хотим иметь возможность отправлять задачи на нашу работу для завершения.Скорее всего, эти задачи будут происходить в рамках неадминистративного масштаба.Возможно, в результате того, что пользователь нажимает кнопку на веб -части в какой -то другой коллекции сайтов.С предыдущими версиями SharePoint это просто невозможно.Только фермерские администраторы могут обновить HOS.Однако с SharePoint 2010 было сделано дополнение к базовому sppersistedObject, который открывает HOS другим пользователям.Чтобы увидеть, как это работает, мы можем изменить нашу основную функцию следующим образом:

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace PersistedObjectDemo
{
    internal class Program
    {
        private const int LOGON_TYPE_INTERACTIVE = 2;
        private const int LOGON_TYPE_PROVIDER_DEFAULT = 0;

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        public static extern bool LogonUser(string userName, string domain, string password, int logonType,
                                            int logonProvider, ref IntPtr accessToken);

        private static void Main(string[] args)
        {
            try
            {
                IntPtr accessToken = IntPtr.Zero;
                if (LogonUser("non-farm-admin-username", "your-domain-name", "your-password", LOGON_TYPE_INTERACTIVE,
                              LOGON_TYPE_PROVIDER_DEFAULT, ref accessToken))
                {
                    using (var identity = new WindowsIdentity(accessToken))
                    {
                        using (identity.Impersonate())
                        {
                            MyPersistedObject obj = MyPersistedObject.Local;
                   //delete existing object and recreate to keep things simple
                            obj.Delete();
                            obj = MyPersistedObject.Local;
                            obj.Foo = "Some updated value";
                            obj.Update();
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                Console.Write(ex);
            }

            Console.WriteLine("Press return to exit");
            Console.ReadLine();
        }
    }
}

Этот код имитирует попытку не фермерского пользователя обновлять HOS.Если мы запустим это, мы увидим следующее исключение, которое является нашим номером 3:

System.Security.SecurityException:Доступ запрещен.на microsoft.sharepoint.administration.sppersistedObject.baseupdate () в PersistedObjectDemo.mypersistedObject.update ()

Неудивительно, что попытка обновить HOS с помощью пользователя не фермерского администратора бросает исключение.Однако, если мы добавим следующий код в mypersistedObject.cs и снова запустим нашу программу, мы увидим, что HOS обновляется соответствующим образом.

protected override bool HasAdditionalUpdateAccess()
{
    return true;
}

Конечно, в реальном приложении мы, вероятно, хотели бы добавить некоторую проверку безопасности в этой функции, а не просто возвращать True и позволить кому-либо обновлять наш объект, но, надеюсь, это иллюстрирует этот момент в достаточной степени.

Есть еще одна Gotcha в отношении безопасности - когда SharePoint установлен 2010 год, по умолчанию только в учетной записи администратора фермы имеет доступ к чтению/записи в базу данных конфигурации.В установке наименьшего количества веб-приложений, кроме центрального администрирования, будут работать в своей собственной учетной записи, и эти учетные записи не будут иметь доступ к записи в базу данных конфигурации.Следовательно, добавление, удаление и обновление объектов в HOS не будет возможно.Хотя переоценка HasadditionAlupDateAccess позволяет нам немного больше контролировать, кто может обновить HOS, если в базовой учетной записи пула приложений нет соответствующих разрешений на базу данных, мы собираемся отдохнуть довольно быстро.

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