Навигация по сайту в ASP.NET 2.0 - Избегаем ограничения прав (Security Trimmings) при помощи атрибута roles

ОГЛАВЛЕНИЕ


Избегаем ограничения прав (Security Trimmings) при помощи атрибута roles

Бывают случаи, когда вам нужно будет явно указать в ограничениях прав то, что не стоит ограничивать доступ к карте сайта для конкретной роли или группы ролей. Например, если ваша карта сайта содержит ссылку на внешний ресурс, система навигации сайта не сможет определить правила авторизации для внешнего ресурса. Тем самым она ставит ограничения на все узлы для всех пользователей. То есть, если вы используете ограничения прав (security trimming) и используете карту сайта с ссылкой на внешний ресурс (например <siteMapNode url="http://www.scottonwriting.net/sowBlog/" title="My Blog" />), то ни один из пользователей не увидит этого в элементах TreeView либо Menu. Более того, вам наверняка понадобится настроить систему навигации таким образом, чтобы она отображала данный узел для пользователей, обладающих ролями администратора и тестера (либо для всех пользователей, независимо от их роли.)

Аналогично вам может понадобиться отобразить пользователям узлы локальной карты сайта, даже если у них нет доступа к данным ресурсам. Например, пользователь, который посещает карту сайта и ему еще необходимо авторизоваться, скорее всего, не увидит Admin link в TreeView. Тем не менее мы все же хотим отобразить ее. Нажатие на ссылку вызовет перенос пользователя на страницу ~/Admin/Default.aspx, где система различит авторизированных пользователей от неавторизированных. То есть они будут перенесены на страницу авторизации. После авторизации они будут автоматически перенесены обратно на страницу администрирования (Admin). Если же они обладают ролью администратора (Administrator role), то им будет разрешен доступ к разделу администратора (Admin), в противном случае они будут перенесены обратно на страницу авторизации.

Чтобы устанавливать ограничение по правам на определенные узлы сайта , используйте атрибут roles в соответствующем элементе <siteMapNode>. (Заметьте: данная настройка не будет действовать на потомков элемента <siteMapNode>; то есть вам необходимо напрямую настроить данный атрибут в элементах <siteMapNode>, в которых вы хотели бы явно указать дополнительные роли, которым необходимо видеть данный узел.) Атрибут roles может содержать одно название роли, список имен, отделенных запятой, либо звезду (*) для выбора всех пользователей. Следующий файл карты сайта, включенный в приложение, доступное в конце данной статьи, демонстрирует, как использовать атрибут roles для отображения всем пользователям узла карты сайта с ссылкой на внешний ресурс. (Следует помнить, что результатом опущения атрибута roles в приведенном случае будет то, что данный узел карты сайта не будет отображен никому из пользователей, если установлены ограничения по правам.)

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/Default.aspx" title="Home">
    <siteMapNode url="~/About.aspx" title="About" />
    <siteMapNode url="~/Admin/Default.aspx" title="Admins" />
    <siteMapNode url="~/Tester/Default.aspx" title="Tester" />
    <siteMapNode url="~/AuthUsers/Default.aspx" title="Auth Users Only" />
    <!-- For links to outside resources, need to explicitly define what roles should be shown this section -->
    <siteMapNode url="http://www.scottonwriting.net/sowBlog/" title="My Blog" roles="*" />
  </siteMapNode>
</siteMap>

Атрибут roles также может быть использован для добавления некоторого улучшения функциональности характеристик ограничений по правам (security trimming). При использовании данных ограничений провайдер навигации по сайту автоматически проверяет правила авторизации для всех узлов, указанных в карте сайта. Вы можете обойти данную проверку для тех узлов, которые вы хотите отображать всем пользователям (например, Home и About в указанном выше примере), путем добавления roles="*". Добавляя данный атрибут, вы сократите стандартную проверку авторизации, тем самым улучшая функциональность ограничений по правам.