Формирует аутентификацию с помощью Sitemap и asp: Управление меню
-
10-07-2019 - |
Вопрос
У меня есть сайт с 2 разделами - один для клиентов и один, по сути, для администраторов.Каждый раздел находится в отдельном каталоге со своим web.config и картой сайта.Безопасность и доступ работают нормально.
Однако, когда я вхожу в систему как администратор, я хочу видеть пункты меню, которые ссылаются на другой раздел.Я добавил ссылки на карту сайта, например:
<siteMapNode url="~/Customer/Default.aspx?3" title="Customer Site"
description="Switch to customer site" roles="Administrator"/>
Похоже, это не имеет никакого эффекта, так как я по-прежнему вижу пункт меню при входе в систему в качестве клиента.Когда я включаю настройку безопасности, как в
<siteMap enabled="true">
<providers>
<add name="InternalSiteMap" type="System.Web.XmlSiteMapProvider"
siteMapFile="~/Internal/Internal.sitemap" />
<add name="CustomerSiteMap" type="System.Web.XmlSiteMapProvider"
siteMapFile="~/Customer/Customer.sitemap" securityTrimmingEnabled="true" />
</providers>
</siteMap>
все пункты меню исчезли.
На самом деле у меня есть web.configs как во внутренней, так и в клиентской папках, напримердля клиента:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow roles="Customer" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
и администратор:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow roles="Administrator" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
Опять же, авторизация работает, и когда я вхожу в систему как Клиент и нажимаю на ссылку внутреннего сайта в меню, я перенаправляюсь на страницу входа в систему.Как администратор, я могу перейти на сайт администратора.Как только я включаю настройку безопасности для поставщика sitemap, который, как предполагается, удаляет ссылки, для которых я не авторизован, из меню, все меню исчезает.Что я упускаю из виду?Нужно ли мне настраивать элемент управления asp.menu для совместной работы с этим?
Обновить:Я ставлю награду за этот вопрос, потому что я все еще не могу заставить его работать.Мы склонны отказаться от элемента управления меню и написать свой собственный, но если кто-то может дать подсказку, это, конечно, было бы предпочтительнее.Опять же, проблема не в безопасности - роли и правила доступа работают так, как ожидалось.Это связано с управлением меню и настройкой безопасности.Меню полностью исчезает, когда для карты сайта включена настройка безопасности.
Обновить:Спасибо, что нашел этот пост в блоге, Павел.Из этого я узнал, что если есть записи sitemap, у которых нет пути и URL (что также верно для некоторых моих вложенных файлов), элемент управления не может определять разрешения из настроек в web.config, и вы должны указать роли в sitemap.В противном случае они будут скрыты по умолчанию.
Решение
От Горизонтальное меню исчезает с securityTrimmingEnabled = " true " :
Убедитесь, что у каждой роли есть доступ на (неиспользованный) фиктивный siteMapNode в корень путем включения ролей = " * " в web.sitemap показано ниже:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap enableLocalization="true"
xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="" title="" roles="*" description="">
<siteMapNode url="~/default.aspx" resourceKey="siteMapHome"
title="Home" roles="admin,account" description="" />
<!-----More nodes-->
Другие советы
http://www.vbforums.com/showthread.php?p=3625975
Убедитесь, что у вошедшего в систему пользователя есть роль Администратора.
Редактировать:
Я также почти уверен, что вы не хотите указывать роль в SiteMapNode.Я верю, что карты сайтов на основе ролей работают с существующими ролями, например, если у пользователя есть доступ к пути, указанному в примечании к сайту, то он отобразит его.
Также укажите путь в webs.config.
<location path="admin/">
<system.web>
<authorization>
<allow roles="Admin" />
<deny users="*"/>
</authorization>
</system.web>
</location>
И, наконец, удалите символ "~" с карты вашего сайта, чтобы сравнение соответствовало.
Как только все это будет сделано, и если это все еще не работает, объедините web.configs, чтобы убедиться, что разрешения не теряются.