Показать Node в MvcSiteMapProvider, если его действие отмечено [Authorize(Roles = Administrator)]

В настоящее время у меня есть Controller с методом действия Index(), который требует авторизации:

public partial class CustomerController : BaseDocumentStoreController
{
    [Authorize(Roles = AccountController.Administrator)]
    public virtual ViewResult Index()
    {
        ...
    }

    ...
}

При этом соответствующий узел в Mvc.sitemap не будет отображаться в панировочных сухарях:

<mvcSiteMapNode     title="Customer"         controller="Customer" action="Index"
                    resourceKey="Customers"  clickable="true" >

    <mvcSiteMapNode title="Customer Add"     controller="Customer" action="Add"
                    resourceKey="Add"  />
    <mvcSiteMapNode title="Customer Create"  controller="Customer" action="Create"
                    resourceKey="Add" />
    <mvcSiteMapNode title="Customer Edit"    controller="Customer" action="Edit"
                    resourceKey="Edit" />
    <mvcSiteMapNode title="Customer Update"  controller="Customer" action="Update"
                    resourceKey="Edit" />
    <mvcSiteMapNode title="Customer Delete"  controller="Customer" action="Delete"
                    resourceKey="Delete" />
    <mvcSiteMapNode title="Customer Details" controller="Customer" action="Details"
                    resourceKey="Details" />
    <mvcSiteMapNode title="Customer Search"  controller="Customer" action="Search"
                    resourceKey="Search" />

</mvcSiteMapNode>

Я все равно хочу показать этот узел...

Допустим, пользователь не аутентифицирован. Итак, я хочу, чтобы хлебные крошки показывали это:

Home > Customers > Add

В настоящее время он показывает только:

Add

Если пользователь щелкнет узел Клиенты, он будет перенаправлен на экран входа в систему... Хорошо, все в порядке!

Я попытался реализовать свой собственный SiteMapVisibilityProvider, выполнив эти шаги:

public class SiteMapVisibilityProvider : ISiteMapNodeVisibilityProvider
{
   ...
}

Во время отладки я мог видеть только узлы ниже узла Index, то есть в моем текущем случае отображался только узел Add. Узел, представляющий метод действия Index, не отображался в сеансе отладки.

Есть ли способ достичь того, чего я хочу?


person Leniel Maccaferri    schedule 22.04.2012    source источник


Ответы (1)


Проблема, скорее всего, заключается в DefaultAclModule, который скрывает все узлы, недоступные текущему пользователю. Если вам не нужна эта функция, ее можно отключить, установив для securitytrimming значение false в поставщике карты сайта в web.config.

Вы также можете изменить функциональность, внедрив пользовательский файл AclModule.

person Xharze    schedule 22.04.2012
comment
Вы совершенно правы! Попробовал установить securityTrimmingEnabled="false" в web.config, все отлично работает! После прочтения этого сообщения в блоге Маартена (создателя MvcSiteMapProvider): blog.maartenballiauw.be/post/2008/08/29/ Теперь я понимаю, как атрибут Authorize работает с узлом MvcSiteMapNode. Концепция, о которой я не знал, - это обрезка безопасности, которую вы упоминаете в своем ответе. Спасибо большое дружище... :) - person Leniel Maccaferri; 23.04.2012
comment
Кстати: я видел вашу прекрасную серию постов под названием «Внутри MvcSiteMapProvider». Действительно полезный человек... Это просто говорит об упомянутом вами AclModule: xharze.blogspot.com.br/2012/04/ Отличная работа, так держать. - person Leniel Maccaferri; 23.04.2012