在公司 Intranet 门户中,我希望允许任何访问者(任何经过身份验证的用户)使用用户 Web 部件自定义某些页面。

我想仅在某些页面上限制此自定义。

到目前为止,我创建了一个新的权限级别“自定义用户 Web 部件”,它定义了此权限:

  • 添加和自定义页面
  • 添加/删除个人 Web 部件
  • 更新个人 Web 部件

这是我发现允许添加用户 Web 部件的最小权限集。

在我的门户中,我有一个“我的门户网站的访问者“ 团体。

如果我向该组应用自定义权限级别(保持 OOB 读取权限级别) 网络 级别,我可以在页面上添加用户 Web 部件。

但是,如果我在任一位置应用此权限级别 页面的库 水平或 特定页面 level(破坏权限继承),我无法添加用户webpart。

是否可以仅在特定页面上应用此权限?

请注意,我 删除或更新 Web 部件。它仅添加受限制的 Web 部件。

仅供参考,Web 部件实际上是通过代码从自定义“管理器”Web 部件添加的。

特别是,这段代码抛出异常:

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 日志中,我只看到以下内容:

导入 Web 部件时出错。程序集 Microsoft.SharePoint,版本=14.0.0.0,文化=中性,PublicKeyToken=71e9bce111e9429c,类型名称。Microsoft.SharePoint.WebPartPages.ContentEditorWebPart

这是相当令人不安的。

[编辑] 有了 Reflector,我发现 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));
        }

实际上,添加 Web 部件的代码会检查 Web 部件的权限 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);

基本上,其想法是在提升的上下文中导入 Web 部件,但在实际的当前上下文中添加导入的 Web 部件。

它似乎有效,但我不太喜欢这种黑客机制。

其他提示

您希望允许任何访问者(任何经过身份验证的用户)使用用户 Web 部件自定义某些页面...对吗?

在我工作的地方,我们如何做到这一点,我们创建了一个包含所有经过身份验证的用户的帐户的组。我们可以在整个网站集中的任何级别、文档中应用此权限组。

希望这能以某种方式帮助你......

在查看使用 Reflector 找到的方法时,它似乎确实需要 Web 级别权限。您可能需要考虑使用提升的权限执行该块,这应该可以让您避免授予 Web 级别权限的需要。(假设这是一个场解决方案)如果您采用这种方法,您可能会考虑在自定义管理器 Web 部件中添加一些额外的逻辑检查,以确保提升的权限不会被错误地使用/调用。

许可以下: CC-BY-SA归因
scroll top