2013-08-17 30 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