2013-08-17 72 views
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

我使用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角色)访问系统,该节点被显示

回答

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?

+0

进行此更改后,我得到[此错误](http://snag.gy/rHIeY.jpg) 我[Mvc.sitemap这里(http://snippi.com/s/mlih2tf) – ridermansb

+0

我更新了我的答案。 – NightOwl888

+0

我使用'[Authorize]',如果我使用'[Authorize]',为什么不应该这样做? 在测试中,它的工作! 举个例子,我会创建一个,并打开一个问题。谢谢。 – ridermansb