ASP.NET web.sitemap - кажется, роли не контролируют видимость?

Аксессоры - это не безопасность! Это инкапсуляция, чтобы другие не знали о коде.

Подумайте, если кто-то написал Quantum Bogo Sort , но исчез, как только он отменил последнюю ошибку - понимая код заставляет либо удаляться из юниверса, либо сойти с ума.

Несмотря на этот незначительный недостаток, если он правильно инкапсулирован, это должно стать вашим предпочтительным алгоритмом сортировки, так как все поля и методы, кроме Sort, должны быть закрытыми.

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

13
задан Keith Barrows 23 March 2010 в 07:04
поделиться

2 ответа

Я подозреваю, что вы попали в ловушку, в которую попадаем мы все, полагая, что атрибут roles ограничивает видимость узлов. Это не так, на самом деле он расширяет видимость. Все ограничения делаются с помощью стандартной секции в web.config.

Полный текст ниже взят из оригинального сообщения на https://web.archive.org/web/20130408064047/http://ipona.com/asp-net-site-maps-security-trimming-and-roles/ )

Это один из наиболее часто задаваемых вопросов и, похоже, постоянный источник путаницы для всех, как и для меня, когда я впервые прочитал об этом. ASP.NET SiteMap позволяет определить навигационную структуру как набор элементов XML, которые идеально подходят для описания иерархии пунктов меню. Эти XML-элементы представляют собой элемент siteMapNode, который имеет атрибут roles. Кажется очевидным, что он определяет роли, которые могут видеть этот элемент, но на самом деле очевидное неверно. Вот самый важный факт о картах сайта:

Атрибут roles не ограничивает видимость узла.

Это должно быть достаточно ясно, даже если это все еще кажется неправильным. Вот как это работает. Все ограничения для страниц обрабатываются через авторизацию. Вы можете сделать это либо в базовом web.config, либо в файлах web.config в папках. Например, предположим, есть папка Admin, в которой хранятся все административные страницы. Вы хотите, чтобы эти страницы были доступны только пользователям с ролью Admin. Вы настроите авторизацию следующим образом:

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

Теперь к папке Admin не может получить доступ никто, кто не входит в роль Admin; если вы не в роли Admin и попытаетесь перейти на страницу в папке Admin либо по ссылке на другой странице, либо введя URL непосредственно в браузер, вы будете перенаправлены на страницу входа. Вы можете иметь несколько элементов расположения в вашем web.config, для разных папок или даже отдельных файлов; на самом деле, если у вас сайт с ограничениями, вы можете захотеть явно открыть определенные страницы, такие как страница входа; трудно войти на сайт, если у вас нет разрешения на доступ к странице входа. Если вы предпочитаете не загромождать свой базовый web.config, вы можете создать файл web.config в папке Admin с теми же правилами; вам не понадобится элемент location, поскольку конфигурация применяется к текущей папке.

Итак, авторизация выполнена; доступ к страницам закрыт. Теперь рассмотрим навигацию. Навигационная структура ASP.NET соблюдает авторизацию, но только если вы настроите security trimming на провайдере, который по умолчанию не настроен. Это означает, что вам нужно добавить конфигурацию карты сайта в web.config:

<siteMap enabled="true" defaultProvider="AspXmlSiteMapProvider">
  <providers>
    <clear />
    <add name="AspXmlSiteMapProvider" securityTrimmingEnabled="true"
     type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
     siteMapFile="web.sitemap"/>
  </providers>
</siteMap>

Большая часть этого настраивается на уровне машины при установке ASP.NET, но очень важно, что значение securityTrimmingEnabled по умолчанию установлено в false. Вышеописанное очищает существующую конфигурацию и добавляет новую запись с атрибутом, установленным в true. На этом этапе система навигации теперь будет соблюдать правила авторизации, поэтому пункты меню не будут отображаться, если у пользователя нет прав на этот пункт; не имеет значения, используете ли вы Menu или TreeView для отображения пунктов меню, главное - использовать SiteMapDataSource (или API Sitemap, если вы создаете меню вручную). Если у вас есть пользовательский поставщик карты сайта, например, управляемый базой данных (как этот на MSDN), то, возможно, придется выполнять собственную проверку безопасности, но это зависит от того, от какого базового класса вы наследуете. Но это уже другая история для другого поста.

Итак, если вам не нужно изменять сами элементы карты сайта, то для чего нужен атрибут roles? Ну, он работает противоположным образом, как вы, вероятно, ожидаете, открывая видимость узла, показывая узел, если пользователь находится в указанной роли, даже если у него нет прав доступа к самой странице (потому что правило авторизации ограничивает его доступ к ней). Зачем вам это делать? Вы должны понимать, как работает обрезка безопасности. При решении вопроса о том, может ли пользователь видеть узел, проверяются как авторизация, так и физические разрешения на файл; если ни одно из них не работает, узел считается недоступным. Есть два очень распространенных случая, когда проверка физического файла не удается:

  1. URL не является локальным. Если файл не существует локально, то проверка не может быть выполнена.
  2. URL-адрес отсутствует. Узел может быть просто узлом-контейнером, с дочерними страницами, но без самой страницы.

В обоих этих случаях проверка физического файла не работает, поэтому узел не будет показан. Поэтому вам может понадобиться открыть видимость узла. Например, рассмотрим следующее:

<siteMapNode title="Admin" roles="Admin">
    <siteMapNode url="~/Admin/membership_CreateMember.aspx" title="Create User" />
    <siteMapNode url="~/Admin/membership_GetUsers.aspx" title="View Users" />
    <siteMapNode url="~/Admin/roleManager_CreateRole.aspx" title="Create Role" />
    <siteMapNode url="~/Admin/roleManager_AddUserToRole.aspx" title="Add User to Role" />
</siteMapNode>

Здесь узел Admin не имеет физической страницы, он служит только для организации элементов администратора в собственное подменю. Без дополнительного атрибута roles узел и дочерние элементы не появились бы, но roles="Admin" указывает, что узел должен быть показан пользователям с ролью Admin, даже если проверка безопасности не прошла. Нам не нужен атрибут для дочерних узлов, потому что у них есть физические страницы, поэтому проверка файлов будет успешной.

Итак, все довольно просто, если вы помните правила:

  • Настройте ограничения безопасности для страниц с авторизацией в web.config.
  • Переопределите провайдера карты сайта, включив защиту обрезку.
  • Добавьте атрибут roles к узлам карты сайта, чтобы расширить видимость.
29
ответ дан 1 December 2019 в 20:11
поделиться

То, что вам нужно, это то, что ASP.NET называет « Обрезка безопасности карты сайта ». Вы уже выполнили большую часть работы, а именно назначили роли узлам в карте сайта. Теперь все, что вам осталось сделать, это немного настроить.

В своем web.config добавьте нового поставщика карты сайта, используя стандартный XmlSiteMapProvider , но с securityTrimmingEnabled = "true" , и сделайте это поставщик по умолчанию:

<system.web>
  <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
    <providers>
      <add name="TrimmedSitemap"
        type="System.Web.XmlSiteMapProvider"
        siteMapFile="Web.sitemap"
        securityTrimmingEnabled="true" />
    </providers>
  </siteMap>
</system.web>
1
ответ дан 1 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: