No se puede permitir que los visitantes agreguen elementos web de usuario solo en algunas páginas

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

Pregunta

En un portal de intranet corporativo, quiero permitir que cualquier visitante (cualquier usuario autenticado) personalice algunas páginas con elementos web de usuario.

Quiero restringir esta personalización sólo en algunas páginas.

Por ahora, creé un nuevo nivel de permiso "Personalizar elementos web de usuario", que define estos permisos:

  • Agregar y personalizar páginas
  • Agregar o quitar elementos web personales
  • Actualizar elementos web personales

Este es el conjunto de permisos más pequeño que encuentro para permitir agregar elementos web de usuario.

En mi portal tengo un "Visitante de mi portal" grupo.

Si aplico a este grupo el nivel de permiso personalizado (manteniendo el nivel de permiso de lectura OOB) en el web nivel, puedo agregar elementos web de usuario en las páginas.

Sin embargo, si aplico este nivel de permiso en cualquier biblioteca de la página nivel o pagina especifica nivel (rompiendo la herencia de permisos), no puedo agregar el elemento web del usuario.

¿Es posible aplicar estos permisos sólo en páginas específicas?

Por favor tenga en cuenta que yo poder eliminar o actualizar elementos web.Lo único que está restringido es agregar un elemento web.

Para su información, los elementos web en realidad se agregan mediante código, desde un elemento web "administrador" personalizado.

Especialmente, este código arroja la excepción:

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); 
    }
}

El ImportWebPart El método arroja alguna excepción oscura:

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)

En los registros de ULS, sólo veo esto:

Error al importar WebPart.Ensamblado Microsoft.SharePoint, Versión=14.0.0.0, Cultura=neutral, PublicKeyToken=71e9bce111e9429c, TypeName.Microsoft.SharePoint.WebPartPages.ContentEditorWebPart

Lo cual es bastante inquietante.

[Editar] Con Reflector, encontré en el WebPartImporter.CreateWebPart método esta verificación:

     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));
        }

En realidad, el código para agregar un elemento web verifica el permiso en el SPWeb objeto.

¿Debo concluir que mi escenario no es compatible?:(

¿Fue útil?

Solución

Después de algunos experimentos, aquí está parece funcionar solución :

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);

Básicamente, la idea era importar el elemento web en un contexto elevado, pero agregar el elemento web importado en el contexto actual real.

Parece funcionar, pero no soy muy partidario de ese mecanismo de piratería.

Otros consejos

Quiere permitir que cualquier visitante (cualquier usuario autenticado) personalice algunas páginas con elementos web del usuario... ¿Verdad?

Cómo hacemos esto donde trabajo, creamos un grupo que incluye las cuentas de todos los usuarios autenticados.Podemos aplicar este grupo de permisos en cualquier nivel y documentar toda una colección de sitios.

Espero que esto te ayude de alguna manera...

Al revisar el método que encuentra con reflector, parece que requiere permisos de nivel web.Es posible que desee considerar ejecutar el bloque con permisos elevados, lo que le permitirá evitar la necesidad de otorgar permisos a nivel web.(Suponiendo que se trata de una solución de granja) Si sigue ese camino, podría considerar agregar alguna verificación lógica adicional en su elemento web de administrador personalizado para asegurarse de que los privilegios elevados no se estén usando/invocando incorrectamente.

Licenciado bajo: CC-BY-SA con atribución
scroll top