Frage

In einem Unternehmens-Intranetportal möchte ich jedem Besucher (jedem authentifizierten Benutzer) erlauben, einige Seiten mit Benutzer-Webparts anzupassen.

Ich möchte diese Anpassung nur auf einige Seiten beschränken.

Mittlerweile habe ich eine neue Berechtigungsstufe erstellt.Passen Sie Benutzer-Webparts an", das diese Berechtigungen definiert:

  • Seiten hinzufügen und anpassen
  • Persönliche Webparts hinzufügen/entfernen
  • Persönliche Webparts aktualisieren

Dies ist der kleinste Satz an Berechtigungen, den ich finde, um das Hinzufügen von Benutzer-Webparts zu ermöglichen.

In meinem Portal habe ich ein „Besucher meines Portals" Gruppe.

Wenn ich auf diese Gruppe die benutzerdefinierte Berechtigungsstufe anwende (wobei die OOB-Leseberechtigungsstufe beibehalten wird). Netz Ebene kann ich Benutzer-Webparts auf den Seiten hinzufügen.

Wenn ich diese Berechtigungsstufe jedoch auf beides anwende Bibliothek der Seite Ebene bzw bestimmte Seite Ebene (Unterbrechung der Berechtigungsvererbung) kann ich kein Benutzer-Webpart hinzufügen.

Ist es möglich, diese Berechtigungen nur auf bestimmte Seiten anzuwenden?

Bitte beachten Sie, dass ich dürfen Webparts entfernen oder aktualisieren.Nur das Hinzufügen von Webparts ist eingeschränkt.

Zu Ihrer Information: Die Webparts werden tatsächlich per Code aus einem benutzerdefinierten „Manager“-Webpart hinzugefügt.

Insbesondere dieser Code löst die Ausnahme aus:

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

Der ImportWebPart Methode löst eine obskure Ausnahme aus:

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)

In den ULS-Protokollen sehe ich nur Folgendes:

Fehler beim Importieren von WebPart.Assembly Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, TypeName.Microsoft.SharePoint.WebPartPages.ContentEditorWebPart

Was ziemlich beunruhigend ist.

[Bearbeiten] Mit Reflektor habe ich im gefunden WebPartImporter.CreateWebPart Methode dieser Überprüfung:

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

Tatsächlich prüft der Code zum Hinzufügen eines Webparts die Berechtigung dafür SPWeb Objekt.

Sollte ich zu dem Schluss kommen, dass mein Szenario nicht unterstützt wird?:(

War es hilfreich?

Lösung

Nach einigen Experimenten ist hier Scheint zu funktionieren Lösung :

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

Im Wesentlichen bestand die Idee darin, das Webpart in einem erhöhten Kontext zu importieren, das importierte Webpart jedoch im tatsächlichen aktuellen Kontext hinzuzufügen.

Es scheint zu funktionieren, aber ich bin kein großer Fan eines solchen Hacking-Mechanismus.

Andere Tipps

Sie möchten jedem Besucher (jedem authentifizierten Benutzer) erlauben, einige Seiten mit Benutzer-Webparts anzupassen ... Richtig?

Wie wir das dort machen, wo ich arbeite, haben wir eine Gruppe erstellt, die die Konten aller authentifizierten Benutzer enthält.Wir können diese Berechtigungsgruppe auf jeder Ebene anwenden und eine gesamte Websitesammlung dokumentieren.

Ich hoffe, das hilft dir irgendwie weiter ...

Bei der Überprüfung der Methode, die Sie mit Reflector finden, scheint es, dass dafür Berechtigungen auf Webebene erforderlich sind.Möglicherweise möchten Sie den Block mit erhöhten Berechtigungen ausführen, um die Notwendigkeit zu umgehen, Berechtigungen auf Webebene zu erteilen.(Vorausgesetzt, es handelt sich um eine Farmlösung.) Wenn Sie diesen Weg gehen, sollten Sie erwägen, Ihrem benutzerdefinierten Manager-Webpart eine zusätzliche Logikprüfung hinzuzufügen, um sicherzustellen, dass die erhöhten Berechtigungen nicht falsch verwendet/aufgerufen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top