我目前正在尝试使用xmlsitemapprovider安全地修剪跨越所有网站集的全局导航。一切正常,但因为我使用web.allusers它不显示节点,除非明确授予用户访问权限。由于我的大多数权限都基于Active Directory组,因此我的用户在访问该站点之后才能看到这些节点。如何在不首先访问该站点的情况下为这些用户显示节点?
public class CustomNavSecurityTrim : XmlSiteMapProvider
{
public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
{
try
{
if (node == null)
{
throw new ArgumentNullException("node");
}
if (context == null)
{
throw new ArgumentNullException("context");
}
if (!base.SecurityTrimmingEnabled)
{
return true;
}
if (string.IsNullOrEmpty(node.Url))
{
return this.IsGranted(context, node.ChildNodes);
}
return this.IsGranted(context, node);
}
catch
{
return false;
}
}
private bool IsGranted(HttpContext context, SiteMapNode node)
{
bool isGranted = false;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPWeb web = new SPSite(SPContext.Current.Site.MakeFullUrl(node.Url)).OpenWeb())
{
SPUser user = web.AllUsers[context.User.Identity.Name];
if (user != null)
{
try
{
if ((node.Roles != null) && (node.Roles.Count > 0))
{
foreach (string str in node.Roles)
{
isGranted = (str == "*") || (user.Groups[str] != null);
if (isGranted)
{
break;
}
}
}
isGranted = web.DoesUserHavePermissions(user.LoginName, SPBasePermissions.EmptyMask | SPBasePermissions.ViewPages);
}
catch
{
}
}
}
});
return isGranted;
}
private bool IsGranted(HttpContext context, SiteMapNodeCollection childNodes)
{
bool flag = false;
foreach (SiteMapNode node in childNodes)
{
flag = this.IsGranted(context, node);
if (flag)
{
return flag;
}
this.IsGranted(context, node.ChildNodes);
}
return false;
}
}
}
答案 0 :(得分:0)
如果没有他们首先访问该网站,我如何才能为这些用户显示节点?
您必须为每个新用户拨打SPWeb.EnsureUser()
。此方法使SharePoint“检索”给定用户的帐户并使其“预先知道”到SharePoint。
然而,更重要的是,您应该对性能进行性能测试。您正在提升权限并在每次调用SPWeb
时打开一个新的IsGranted()
实例,而这个实例又会多次调用。这可能会导致严重的性能瓶颈。
我建议重新考虑你想要实现的目标(我没有从你的问题中详细说明),以更加符合SharePoint的架构。