MVCSiteMapProvider: не кликабельные узлы с включенной подстройкой безопасности
Я использую MVCSiteMapProvider, v4.6.1
Это моя проблема: у меня есть раздел моего меню, который виден только администраторам. Я достигаю этого, позволяя подрезать параметры безопасности и декорировать мои контроллеры и / или методы контроллера, чтобы определить критерии подрезки.
AdminTasks
- добавлять
- редактировать
- Удалить
Мне нужно сделать так, чтобы узел "AdminTasks" не щелкался, но оставался видимым только для администраторов.
Поведение, которое я наблюдаю, состоит в том, что, если я отмечу "AdminTasks" как clickable="false"
в карте сайта узел отображается для всех, независимо от того, является ли пользователь администратором или нет. Похоже, в узлах отмечены clickable='false'
Обрезка безопасности не выполняется.
Я предполагаю, что, не исследуя слишком много кода, это когда узел помечен clickable='false'
SiteMapProvider не пытается разрешить какой-либо маршрут (поскольку он все равно не нужен для целей навигации); но при этом он не проверяет декорации в контроллерах, поэтому пропускает подстройку безопасности.
Правильно ли мое предположение? Есть ли какой-нибудь способ иметь не кликабельный узел, который все еще урезан безопасностью?
Спасибо
1 ответ
Не кликабельные "группирующие" узлы не представляют действия контроллера, поэтому не было бы разумного способа управления безопасностью на них с помощью AuthorizeAttribute.
Однако вы можете использовать TrimEmptyGroupingNodesVisibilityProvider, чтобы сделать не кликабельный узел невидимым, когда в нем нет доступных узлов, вложенных в него. Поэтому, если текущий пользователь не имеет разрешения ни для одного из дочерних узлов узла "Задачи администратора", узел "Задачи администратора" будет скрыт.
<mvcSiteMapNode title="Admin Tasks" clickable="false" visibilityProvider="MvcSiteMapProvider.TrimEmptyGroupingNodesVisibilityProvider, MvcSiteMapProvider">
Если у вас есть более сложный сценарий, чем этот, вы также можете создать свой собственный поставщик видимости.