不允许访问者仅在某些页面上添加用户 Web 部件
-
10-12-2019 - |
题
在公司 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 部件中添加一些额外的逻辑检查,以确保提升的权限不会被错误地使用/调用。