Не удается разрешить посетителям добавлять пользовательскую веб-часть только на некоторых страницах

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

Вопрос

На корпоративном портале интрасети я хочу разрешить любому посетителю (любому прошедшему проверку подлинности пользователю) настраивать некоторые страницы с помощью пользовательских веб-частей.

Я хочу ограничить эту настройку только на некоторых страницах.

К настоящему времени я создал новый уровень разрешений "Настройка веб-частей пользователей", который определяет эти разрешения :

  • Добавление и настройка страниц
  • Добавление/удаление личных веб-частей
  • Обновите личные веб-части

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

На моем портале у меня есть "Посетитель моего портала- группа.

Если я применю к этой группе пользовательский уровень разрешений (сохраняя уровень разрешений на чтение OOB) на сеть уровне, я могу добавлять пользовательские веб-части на страницы.

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

Можно ли применить эти разрешения только к определенным страницам?

Пожалуйста, обратите внимание, что я мочь удалите или обновите веб-части.Это только добавление веб-части, доступ к которой ограничен.

К вашему сведению, веб-части на самом деле добавляются с помощью кода из пользовательской веб-части "manager".

В частности, этот код генерирует исключение :

var mgr = web.GetLimitedWebPartManager(file.ServerRelativeUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.User);
var wpFile = web.GetCatalog(SPListTemplateType.WebPartCatalog).RootFolder.Files["somewebpart.webpart"];
System.Web.UI.WebControls.WebParts.WebPart newWebPart;
using (var raw = wpFile.OpenBinaryStream())
{
    using (var xr = XmlReader.Create(raw))
    {
        string error;
        newWebPart = mgr.ImportWebPart(xr, out error); 
    }
}

То ImportWebPart метод выдает какое-то непонятное исключение :

Microsoft.SharePoint.ApplicationRuntime.SafeControls+UnsafeControlException: A Web Part or Web Form Control on this Page cannot be displayed or imported. You don't have Add and Customize Pages permissions required to perform this action
   à Microsoft.SharePoint.WebPartPages.WebPartImporter.CreateWebPart(Boolean clearConnections)
   à Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, Uri webPartPageUri, SPWeb spWeb)
   à Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, SPWeb spWeb)
   à Microsoft.SharePoint.WebPartPages.SPWebPartManager.ImportWebPart(XmlReader reader, String& errorMessage)
   à Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.ImportWebPart(XmlReader reader, String& errorMessage)
   à x.y.z.ImportWebPart(SPLimitedWebPartManager mgr, SPFile wpFile)

В журналах ULS я вижу только это :

Ошибка при импорте веб-части.Сборка Microsoft.SharePoint, версия=14.0.0.0, язык интерфейса=нейтральный, PublicKeyToken=71e9bce111e9429c, имя типа.Microsoft.SharePoint.WebPartPages.ContentEditorWebPart

Что весьма тревожно.

[Править] С отражателем, который я нашел в WebPartImporter.CreateWebPart метод этой проверки:

     if ((!this._spWeb.AllowContributorsToEditScriptableParts && !this._spWeb.DoesUserHavePermissions(SPBasePermissions.EmptyMask | SPBasePermissions.AddAndCustomizePages)) && !this._spWeb.SafeControls.SafeAgainstScript(this._type, out unsafeErrorMessage))
        {
            throw new SafeControls.UnsafeControlException(SafeControls.UnsafeControlException.MakeGenericUnsafeExceptionMessage(unsafeErrorMessage));
        }

На самом деле, код для добавления веб-части проверяет разрешение на SPWeb объект.

Должен ли я сделать вывод, что мой сценарий не поддерживается?:(

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

Решение

После некоторых экспериментов, вот кажется, работает решение :

var web = SPContext.Current.Web;

var mgr = web.GetLimitedWebPartManager(file.ServerRelativeUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.User);


var wpFile = web.GetCatalog(SPListTemplateType.WebPartCatalog).RootFolder.Files["somewebpart.webpart"];



/* Elevated the process just for importing the webpart */
var elevatedWeb = GetElevatedWeb(web); // Get an elevated Web object, that points on the same web
var elevatedMgr = elevatedWeb.GetLimitedWebPartManager(file.ServerRelativeUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.User);
System.Web.UI.WebControls.WebParts.WebPart newWebPart;
using (var raw = wpFile.OpenBinaryStream())
{
    using (var xr = XmlReader.Create(raw))
    {
        string error;
        newWebPart = elevatedMgr.ImportWebPart(xr, out error); 
    }
}


/* Import the webpart, created in the elevated context, but into the current user's context. */
mgr.AddWebPart(newWebPart, "Left", 0);

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

Кажется, это работает, но я не очень люблю такой механизм взлома.

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

Вы хотите разрешить любому посетителю (любому прошедшему проверку подлинности пользователю) настраивать некоторые страницы с помощью пользовательских веб-частей...Верно?

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

Надеюсь, это вам каким-то образом поможет...

При просмотре метода, который вы нашли с помощью reflector, действительно выясняется, что для него требуются разрешения веб-уровня.Возможно, вы захотите рассмотреть возможность выполнения блока с повышенными разрешениями, что должно избавить вас от необходимости предоставлять разрешения веб-уровня.(Предполагая, что это решение для фермы) Если вы пойдете по этому пути, вы могли бы рассмотреть возможность добавления дополнительной проверки логики в веб-часть вашего пользовательского менеджера, чтобы убедиться, что повышенные привилегии не используются / не вызываются неправильно.

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