Не удается разрешить посетителям добавлять пользовательскую веб-часть только на некоторых страницах
-
10-12-2019 - |
Вопрос
На корпоративном портале интрасети я хочу разрешить любому посетителю (любому прошедшему проверку подлинности пользователю) настраивать некоторые страницы с помощью пользовательских веб-частей.
Я хочу ограничить эту настройку только на некоторых страницах.
К настоящему времени я создал новый уровень разрешений "Настройка веб-частей пользователей", который определяет эти разрешения :
- Добавление и настройка страниц
- Добавление/удаление личных веб-частей
- Обновите личные веб-части
Это наименьший набор разрешений, который я нахожу, позволяющий добавлять пользовательские веб-части.
На моем портале у меня есть "Посетитель моего портала- группа.
Если я применю к этой группе пользовательский уровень разрешений (сохраняя уровень разрешений на чтение 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, действительно выясняется, что для него требуются разрешения веб-уровня.Возможно, вы захотите рассмотреть возможность выполнения блока с повышенными разрешениями, что должно избавить вас от необходимости предоставлять разрешения веб-уровня.(Предполагая, что это решение для фермы) Если вы пойдете по этому пути, вы могли бы рассмотреть возможность добавления дополнительной проверки логики в веб-часть вашего пользовательского менеджера, чтобы убедиться, что повышенные привилегии не используются / не вызываются неправильно.