Настраиваемая пользователем безопасность веб-сайта asp.net для точного управления доступом к страницам и кнопкам

У меня есть веб-сайт ASP.NET 2.0 [пока нет ajax ...], который будет развернут в скомпилированной форме на нескольких сайтах клиентов. Обычно сайт предназначен только для внутренней сети. Некоторые клиенты доверяют всем своим людям и не заботятся об ограничении доступа к сайту и / или функциям страницы, другие никому не доверяют и хотят, чтобы только определенные люди и / или группы могли просматривать определенные страницы, нажимать определенные кнопки и т. д. al.

Я мог бы сделать какое-нибудь самодельное решение, возможно, управлять разрешениями доступа из таблицы базы данных, но прежде чем я пойду по этому пути, я подумал, что спрошу в SO: какое хорошее решение для этой ситуации? предпочтительно тот, которым можно полностью управлять в файле web.config и / или базе данных, поскольку восстановление веб-сайта невозможно (для клиента, и я не хочу, чтобы ему приходилось делать это снова и снова). Интеграция с Active Directory была бы бонусом, но не требованием (если только это не проще).

в качестве отправной точки, я думаю, что каждой странице / функциональной точке на сайте будет предоставлена ​​идентификация и связана с группой разрешений ...

Обновлено: раздел авторизации web.config, чтобы разрешить / запретить доступ по роли и пользователю, это хорошо, но это только половина проблемы - другая половина контролирует доступ к отдельным методам (кнопкам, любым) на каждой странице. Например, некоторые пользователи могут просматривать whatchamacallits, в то время как другим разрешено редактировать, создавать, удалять или отключать / включать их. Все эти кнопки / ссылки / действия находятся на странице просмотра ...

[в идеале я бы сделал отключенные кнопки невидимыми, но здесь это не важно]

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

  • Атрибуты требования безопасности разрешения будут вызывать исключения при нажатии кнопок, что не очень удобно; я бы предпочел скрыть кнопки, которые пользователю не разрешено использовать
  • Элемент управления LoginView также интересен, но потребует репликации большей части содержимого страницы несколько раз (один раз для каждой роли) и может не обрабатывать случай, когда пользователь находится в более чем одной роли - я не могу предположить, что роли являются иерархическими, поскольку они будет определено заказчиком

Обновлено: платформа - Win2K / XP, Sql Server 2005, ASP.NET 2.0, без использования AJAX

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 002
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

Я мало что знаю о вашем приложении, но вы можете посмотреть тег авторизации в файле web.config:

<authorization>
    <!--  
        <deny users = "?" />
        <allow     users = "[comma separated list of users]"
                   roles = "[comma separated list of roles]"/>
        <deny      users = "[comma separated list of users]"
                   roles = "[comma separated list of roles]"/>
    -->
</authorization>

Вы можете разделить файлы web.config для каждого каталога в своем веб-приложении и вложить каталоги. Каждый файл web.config может иметь собственный раздел авторизации. Если вы помещаете разные страницы в каждый каталог, вы можете эффективно управлять безопасностью, разрешая определенную роль в каждом файле web.config и запрещая все остальное. Затем вы можете управлять участниками каждой роли в активном каталоге. Я обнаружил, что это эффективное решение, потому что оно эффективно использует структуру безопасности Microsoft Active Directory и ASP.NET без написания собственных пользовательских материалов, а если вы используете роли, можно переложить управление членством в роли на кого-то, кто им не нужно прикасаться к файлу web.config, им просто нужно знать, как использовать консоль управления AD.

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

Steven A. Lowe 07.10.2008 08:38

принято как "ответ", поэтому страница статистики перестанет меня приставать

Steven A. Lowe 27.12.2008 21:34

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

[PrincipalPermissionAttribute(SecurityAction.Demand, Name = "MyUser", Role = "User")]
public static void PrivateInfo()
{   
    //Print secret data.
    Console.WriteLine("\n\nYou have access to the private data!");
}

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

Кроме того, вам понадобится прочитать для встроенной проверки подлинности Windows, чтобы получить возможность Active Directory.

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

Steven A. Lowe 07.10.2008 18:20

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

Используйте в сочетании со стандартной безопасностью web.config (интегрированные окна с активным каталогом или аутентификация с помощью форм (схема сервера asp 2 Sql или ваша собственная).

<asp:LoginView id = "LoginView1" runat = "server">
                    <RoleGroups>
                        <asp:RoleGroup Roles = "Admin">
                            <ContentTemplate>
                                <asp:LoginName id = "LoginName2" runat = "Server"></asp:LoginName>, you
                                are logged in as an administrator.
                            </ContentTemplate>
                        </asp:RoleGroup>
                        <asp:RoleGroup Roles = "User">
                            <ContentTemplate>
                                <asp:Button id = "Button1" runat = "Server" OnClick = "AllUserClick">
                            </ContentTemplate>
                        </asp:RoleGroup>
                    </RoleGroups>
                </asp:LoginView>

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

Steven A. Lowe 07.10.2008 18:23

Я думаю, мне придется объединить авторизацию AD с таблицами «функций и разрешений» в базе данных, чтобы получить необходимый нам детальный контроль -

  • используйте файл web.config, чтобы разрешить только авторизованным пользователям (через группы AD) посещать веб-сайт
  • составьте таблицу «функций», в которой перечислены все страницы и функции, которые могут быть затронуты, например кнопка редактирования страницы 1, кнопка удаления страницы 2, сетка деталей страницы 3 и т. д.
  • создать таблицу разрешений с указанием функции и группы AD, которой разрешено использовать эту функцию
  • изменить страницы сайта, чтобы проверить права доступа к функциям при загрузке страницы (или предварительную визуализацию, в зависимости от ситуации), чтобы отключить / скрыть запрещенные функции по мере необходимости

Примеры:

  • Администраторы могут использовать все возможности сайта
  • Разработчики могут использовать все возможности сайта
  • Менеджеры могут просматривать все страницы, но могут только добавлять и редактировать информацию, без удаления
  • Супервизоры могут просматривать сводки по всем отделам, но просматривать и редактировать детали только для своего собственного отдела (для каждого отдела и отдела-супервизора есть группа AD)
  • Сотрудники могут просматривать сведения только о своем отделе
  • и т.п.

Окончательное решение свело понятие «функция» к бинарному решению, можно или нельзя использовать, и добавило флаг «разрешающий / не разрешающий» для каждой функции. Это позволяет определять функции, которые могут использовать почти все, как «разрешающие», и тогда в таблице разрешений должны быть записаны только группы, которым отказано в разрешении на использование этой функции. Для функции, определенной как не разрешающая, по умолчанию никто не может использовать эту функцию, и вам необходимо создать записи в таблице разрешений для групп, которым разрешено использовать эту функцию. Похоже, что это дает лучшее из обоих миров решение, поскольку сокращает количество записей разрешений, необходимых для каждой функции.

Я думаю, что вам нужно здесь реализовать набор методов запроса разрешений либо в ваших бизнес-объектах, либо в вашем контроллере. Примеры: CanRead (), CanEdit (), CanDelete ()

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

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

В книге Рокки Лхотки есть код, использующий эту модель. Новой версии пока нет в Google.

Я начал с этого подхода, но вскоре столкнулся с проблемами, так как не все разрешения основаны на доступе к сущности; некоторые просто поведенческие и довольно произвольные.

Steven A. Lowe 20.12.2008 01:00

см. правки к моему ответу; бинарная авторизация группы AD плюс разрешение функции, похоже, решает все требования

Steven A. Lowe 20.12.2008 01:03

Другие вопросы по теме