运行命令@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
角色)访问系统时,显示节点
答案 0 :(得分: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吗?