SharePoint 2010安全修整使用web.allusers自定义全局导航

时间:2013-10-18 19:58:49

标签: c# sharepoint sharepoint-2010

我目前正在尝试使用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;
    }
}

}

1 个答案:

答案 0 :(得分:0)

  

如果没有他们首先访问该网站,我如何才能为这些用户显示节点?

您必须为每个新用户拨打SPWeb.EnsureUser()。此方法使SharePoint“检索”给定用户的帐户并使其“预先知道”到SharePoint。


然而,更重要的是,您应该对性能进行性能测试。您正在提升权限并在每次调用SPWeb时打开一个新的IsGranted()实例,而这个实例又会多次调用。这可能会导致严重的性能瓶颈。

我建议重新考虑你想要实现的目标(我没有从你的问题中详细说明),以更加符合SharePoint的架构。