2009-12-20 3 views
1

У меня есть страница с несколькими сетками и небольшая форма с 7 элементами управления. Сетки показывают вспомогательные данные. В целом имеется около 320 строк кода, которые обрабатывают различные события. У меня есть требование, чтобы одна конкретная роль должна была редактировать только 3 поля из 7, тогда как все другие роли, имеющие доступ к этой странице, могут редактировать все из них.ASP.NET: безопасность на основе ролей и дизайн страницы

Теперь на мой вопрос. Обычно мы применяем подход к ограничению защиты на основе ролей на уровне страницы, поскольку, делая эту безопасность в .Net, становится полностью настраиваемой. Но в этом случае я собираюсь сделать исключение из-за этого требования, и это новая территория, на которой у меня нет шаблонов. Объем дублирования кода, который мне нужно будет сделать, чтобы создать отдельную страницу для роли с доступом только к 3 элементам управления, делает это не вариантом, даже если я поместил некоторые вещи в пользовательские элементы управления, что кажется неоправданным количеством работы так или иначе.

Моя первая мысль состояла в том, чтобы отключить все элементы управления в событии page_load, которые недоступны для текущего пользователя, но это кажется уродливым. Есть ли лучший способ сделать это?

ответ

1

Вы можете подклассифицировать типы управления, которые хотите защитить, и определить в событии OnLoad, разрешать ли пользователю редактировать.

public class ProtectedTextBox : TextBox 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     bool hasAccess = CurrentUserHasAccess(); // TODO 
     if (hasAccess) 
     { 
      Enabled = true; 
     } 
     else 
     { 
      Enabled = false; 
     } 
    } 
} 

Затем назначить префикс для управления в вашем web.config:

<pages> 
    <controls> 
     <add tagPrefix="me" Namespace="YourNamespace" assembly="YourAssembly" /> 
    </controls> 
</pages> 

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

<me:ProtectedTextBox runat="server" <!-- etc. -->> 

Сделайте то же самое для кнопок, а также любых других типов управления, которые вам нужны.

+0

Мне нравится ваш подход. – cdonner

0

Что делать, если вы сделали еще одну форму, которая также наследуется от того же кода за файлом? Разве это не даст вам другое представление и не позволит вам создать дублирующий код?

+0

На первый взгляд кажется, что это будет, но потом я понял, что моя страница является частью 3-страничного потока. Если I 2 версии для одной из этих страниц, тогда на предыдущей странице должен быть код, который выбирает правильный для роли. Это кажется мне еще менее привлекательным. – cdonner

0

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

+0

Есть несколько кнопок, которые должны быть скрыты, как в Gridviews, так и снаружи. Не все, что зависит от роли, может быть в одной панели. – cdonner

Смежные вопросы