Альтернатива Roles.IsUserInRole («rolename») с использованием элемента местоположения Web.config

1

Позвольте мне начать с того, что у меня есть работы - мне это просто не нравится.

У меня есть web.sitemap, который используется для моей панели навигации. Некоторые из узлов доступны для всех, некоторые из них имеют назначенные роли (так что узел не будет показан пользователям, которые не смогут получить к нему доступ).

т.е. <siteMapNode url="~/adminpage.aspx" title="admin" roles="domain\Administrators"/>

Затем, в моем web.config, у меня есть такие элементы местоположения, как это:

<location path="adminpage.aspx">
  <system.web>
    <authorization>
      <allow roles="domain\Administrators"/>
      <deny roles="*"/>
    </authorization>
  </system.web>
</location>

В дополнение к этому на некоторых страницах есть гиперссылки, которые показаны или скрыты на основе ролей, например:

myHyperlink.Visible = Roles.IsUserInRole(@"domain\Administrators");

Все это прекрасно работает, но... кажется, это немного смешно. Есть ли способ использовать разрешения, установленные в моем Web.config по карте сайта и Roles.IsUserInRole? В принципе, я пытаюсь не допускать одинаковых описаний разрешений в 435234 разных местах.

Я попытался решить проблему Casses, чтобы добавить встроенный код в файл Sitemap, который будет использовать настройки из веб-конфигурации, но это не работает (потому что вы не можете поместить внедренный код в файл Sitemap).

Теги:
web-config

1 ответ

-2

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

Это место, в которое входит второй пример, который вы отправили. Это предотвращает загрузку страницы, если вы не в правильной роли.

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

Если вы хотите скрыть ссылки и ограничить количество кода, которое вы сделали для этого, я бы рекомендовал что-то вроде этого:

<% if Roles.IsUserInRole(@"domain\Administrators") { %>
<a href="~/adminpage.aspx">Admin Page</a>
... any other links you want to limit to the admin role ...
<% } %>

Это, по крайней мере, позволит свести код к минимуму. Ссылки не будут добавлены в DOM, если только пользователь, прошедший проверку подлинности, не входит в эту роль, и если позднее вам нужно будет изменить ту роль, которую вы проверяете, вы должны изменить ее в меньшем количестве мест.

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

РЕДАКТИРОВАТЬ

Чтобы уменьшить дублирование имени роли, попробуйте определить его в разделе web.config и ссылаться на него оттуда. Вы не сможете сделать это для тега location, но вы должны быть в состоянии везде.

ConfigurationManager.AppSettings["AdminRole"]

например.

В файле Sitemap попробуйте

<siteMapNode url="~/adminpage.aspx" title="admin" roles="<% ConfigurationManager.AppSettings["AdminRole"]%>"/>
  • 0
    Я понимаю, что они не определяют одинаковое поведение. Если бы они это сделали, мне бы не понадобились все 3 шага :-). Я пытаюсь избавиться от жестко закодированных ролей повсюду. Они адекватно определены в Web.config - и я бы хотел найти способ их повторного использования.
  • 0
    Когда вы говорите, что они хорошо определены в вашем файле web.config, подразумеваете ли вы элемент местоположения, который вы перечислили?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню