Ne peut pas permettre aux visiteurs d'ajouter un utilisateur partie web sur certaines pages seulement

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

Question

Dans un portail intranet de l'entreprise, je veux permettre à tout visiteur (tout utilisateur authentifié) pour personnaliser certaines pages de l'utilisateur des composants webpart.

Je veux restreindre cette personnalisation uniquement sur certaines pages.

Maintenant, j'ai créé un nouveau niveau d'autorisation "Personnalisez les webparts", qui définit les autorisations :

  • Ajouter et Personnaliser des Pages
  • Ajouter/Supprimer Des Composants Webpart Personnels
  • Mettre À Jour Les Composants Webpart

C'est le plus petit ensemble d'autorisations je trouve pour permettre l'ajout d'utilisateur webparts.

Dans mon portail, j'ai un "Visiteur de mon portail"le groupe.

Si je demande à ce groupe, le niveau d'autorisation personnalisé (en gardant l'OOB niveau d'autorisation lecture) à l' web niveau, je peux ajouter un utilisateur des composants webpart sur les pages.

Cependant, si j'applique ce niveau d'autorisation à la page de la bibliothèque de l' niveau ou page spécifique niveau (rupture de l'héritage des autorisations), je ne peux pas ajouter un utilisateur webpart.

Est-il possible d'appliquer ce autorisations sur certaines pages seulement?

Veuillez noter que je peut supprimer ou mettre à jour des webparts.C'est seulement en ajoutant webpart est limité.

Pour info, les webparts sont effectivement ajouté par le code, à partir d'une mesure "manager" webpart.

En particulier, ce code est en train de jeter de l'exception :

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

L' ImportWebPart la méthode est en train de jeter quelque obscure exception :

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)

Dans les journaux ULS, je ne vois ceci :

Erreur lors de l'importation WebPart.Assemblée De Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, TypeName.Microsoft.SharePoint.WebPartPages.ContentEditorWebPart

Ce qui est assez dérangeant.

[Modifier] Avec Réflecteur, j'ai trouvé dans le WebPartImporter.CreateWebPart cette méthode de vérification:

     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 fait, le code pour ajouter une webpart vérifie les autorisations sur la SPWeb objet.

Dois-je en conclure que mon scénario n'est pas pris en charge?:(

Était-ce utile?

La solution

Après quelques expériences, les voici semble-t-il au travail solution :

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

En gros, l'idée était de les importer à la partie web, en vertu d'une élévation de contexte, mais ajoutez le web importées partie dans le contexte actuel.

Il semble fonctionner, mais je ne suis pas très fan de l'o ce genre de mécanisme.

Autres conseils

Vous voulez permettre à tous les visiteurs (tout utilisateur authentifié) pour personnaliser certaines pages de l'utilisateur de web les pièces...Droit?

La façon dont nous le faisons, où je travaille, nous avons créé un groupe qui comprend les comptes de tous les utilisateurs authentifiés.On peut appliquer ce groupe d'autorisation à n'importe quel niveau, document à travers toute une collection de sites.

Espérons que cela vous aide en quelque sorte...

Dans l'examen de la méthode que vous trouver avec réflecteur, il apparaît qu'elle nécessite le web les autorisations de niveau.Vous pourriez envisager de l'exécution de la bloquer avec des autorisations élevées qui devrait vous obtenir autour de la nécessité de donner un web autorisations de niveau.(En supposant que c'est une solution de batterie) Si vous choisissez cette voie, vous pourriez envisager d'ajouter certains d'appoint vérification de la logique dans votre personnalisé web du gestionnaire de partie, assurez-vous que l'élévation de privilèges ne sont pas utilisées/invoquée de manière incorrecte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top