Проверка подлинности с помощью Sitemap и asp: управление меню - PullRequest
1 голос
/ 29 октября 2009

У меня есть сайт с 2 разделами - один для клиентов и один для администраторов. Каждый раздел находится в своем собственном каталоге со своими web.config и sitemap. Безопасность и доступ работает нормально.

Когда я вошел в систему как администратор, я хочу видеть пункты меню, которые ссылаются на другой раздел. Я добавил ссылки на карту сайта, например:

<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>

Опять же, авторизация работает, и когда я вошел в систему как Клиент и щелкаю по внутренней ссылке сайта в меню, я перенаправляюсь на страницу входа. Как администратор, я могу перейти на сайт администратора. Как только я включаю усечение безопасности для провайдера карты сайта, который должен убирать ссылки, на которые у меня нет прав доступа, меню полностью исчезает. Что мне не хватает? Нужно ли настраивать элемент управления asp.menu для совместной работы с этим?

Обновление: я назначил награду за этот вопрос, потому что до сих пор не могу заставить ее работать. Мы склонны отказываться от управления меню и писать свои собственные, но если кто-то может дать подсказку, это, конечно, предпочтительнее. Опять же - проблема не в безопасности - роли и правила доступа работают, как и ожидалось. Именно с помощью меню управления и безопасности обрезки. Меню полностью исчезает, если для карты сайта включена подстройка безопасности.

Обновление: Спасибо, что нашли этот пост, Павел. Из этого я узнал, что если существуют записи файла Sitemap, у которых нет пути и URL-адреса (что также верно для некоторых из моих подменю), элемент управления не может определить разрешения из настроек в файле web.config, и вам необходимо укажите роли в карте сайта. В противном случае они будут скрыты по умолчанию.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2009

С Горизонтальное меню исчезает с securityTrimmingEnabled = "true" :

Убедитесь, что у каждой роли есть доступ на (неиспользованный) фиктивный siteMapNode в корень, включив role = "*" в 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-->
0 голосов
/ 29 октября 2009

http://www.vbforums.com/showthread.php?p=3625975

Убедитесь, что вошедший в систему пользователь имеет роль администратора.

Edit:

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

Также укажите путь в файле webs.config.

<location path="admin/">
    <system.web>
        <authorization>
            <allow roles="Admin"  />
            <deny users="*"/>
        </authorization>
    </system.web>
</location>

И, наконец, удалите '~' с карты своего сайта, чтобы сравнение совпадало.

Как только все это будет сделано, и если это все еще не работает, объедините файл web.configs, чтобы убедиться, что разрешения не теряются.

...