2013-08-17 1 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 для того, чтобы функции безопасности, чтобы функционировать.

О Exception:

Одним из возможных способов заключается в отключить AuthorizeAttributeAclModule в вашем DI конфигурации, как это выглядит, как вы только с помощью 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) My [Mvc.sitemap здесь] (http://snippi.com/s/mlih2tf) – ridermansb

+0

Я обновил свой ответ. – NightOwl888

+0

Я использую '[Authorize]', почему не следует делать это, если я использую '[Authorize]'? В тестах я сделал, это сработало! Как, например, я создам его и открою проблему. Благодарю. – ridermansb

Смежные вопросы