1

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

}

4

1 回答 1

0

如何让这些用户无需先访问该站点就可以为这些用户显示节点?

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


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

我建议重新考虑您要实现的目标(我没有从您的问题中详细了解)以更符合 SharePoint 的体系结构。

于 2013-10-18T20:41:03.853 回答