1

运行命令时@Html.MvcSiteMap().Menu(false),会显示所有节点(即使是那些被拒绝访问的节点)。

例如,我有控制器Financeiro

[Authorize(Roles = "Financeiro")]
public class homeController : baseController
{
    public ActionResult index()
    {
        return View();
    }
}

Mvc.sitemap

<mvcSiteMapNode title="Financeiro" roles="Financeiro" area="Financeiro" clickable="false">
    <mvcSiteMapNode title="Contas" controller="contas" action="index">
        <mvcSiteMapNode title="Nova conta" action="novo" changeFrequency="Never" btnClass="btn-primary"  />
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Categorias" controller="categorias" action="index" />
    <mvcSiteMapNode title="A Pagar" controller="apagar" action="index" description="Contas a pagar" />
    <mvcSiteMapNode title="A Receber" controller="areceber" action="index" description="Contas a receber" />
</mvcSiteMapNode>

忍者

我使用 Ninject,并安装了包MvcSiteMapProvider.MVC4.DI.Ninject.Modules

在文件中MvcSiteMapProviderModule.cs

this.Kernel.Bind<ISiteMapNodeVisibilityProviderStrategy>().To<SiteMapNodeVisibilityProviderStrategy>()
    .WithConstructorArgument("defaultProviderName", "MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider");

套餐

MvcSiteMapProvider.MVC4 4.0.6
MvcSiteMapProvider.MVC4.Core 4.0.6
MvcSiteMapProvider.MVC4.DI .... 4.0.6 MvcSiteMapProvider.Web 4.0.6

当用户(有或无Financiero角色)访问系统时,显示节点

4

1 回答 1

2

您是否在 Ninject MvcSiteMapProviderModule.cs 文件中启用了安全修整?默认配置在文件顶部有一个变量。

bool securityTrimmingEnabled = false;

它被注入到文件末尾附近的 SiteMapBuilderSet 中:

// Configure the builder sets
this.Kernel.Bind<ISiteMapBuilderSet>().To<SiteMapBuilderSet>().Named("siteMapBuilderSet1")
    .WithConstructorArgument("instanceName", "default")
    .WithConstructorArgument("securityTrimmingEnabled", securityTrimmingEnabled)
    .WithConstructorArgument("enableLocalization", enableLocalization)
    .WithConstructorArgument("siteMapBuilder", this.Kernel.Get<ISiteMapBuilder>("compositeSiteMapBuilder"))
    .WithConstructorArgument("cacheDetails", this.Kernel.Get<ICacheDetails>("cacheDetails1"));

您需要将其更改为true才能使安全功能发挥作用。

关于例外:

一种可能的解决方法是在 DI 配置中禁用 AuthorizeAttributeAclModule,因为看起来您只使用 XmlRolesAclModule:

// Before
        // Configure Security
        this.Kernel.Bind<AuthorizeAttributeAclModule>().ToSelf();
        this.Kernel.Bind<XmlRolesAclModule>().ToSelf();
        this.Kernel.Bind<IAclModule>().To<CompositeAclModule>()
            .WithConstructorArgument("aclModules", 
                new IAclModule[] { 
                    this.Kernel.Get<AuthorizeAttributeAclModule>(), 
                    this.Kernel.Get<XmlRolesAclModule>() 
                });

// After
        // Configure Security
        this.Kernel.Bind<XmlRolesAclModule>().ToSelf();
        this.Kernel.Bind<IAclModule>().To<XmlRolesAclModule>();

但这只是回避问题,如果您使用的是 Authorize 属性或类似过滤器,则不应这样做。

我以前从未见过会导致 AuthroizeAttributeAclModule 抛出异常的配置,我真的很想看看为什么会发生这种情况。你能建立一个演示并在 GitHub 上打开一个问题吗?

于 2013-08-18T12:13:09.440 回答