Рамки разрешений ASP.NET?

Проблема

В ASP.NET нет концепции связывания разрешений с ролями.

Мое приложение

Текущее веб-приложение использует настраиваемое членство пользователей и поставщиков ролей. В приложении есть 4 роли: суперпользователь, администратор, директор и учитель. Когда пользователь входит в систему, он перенаправляется в соответствующий пользовательский интерфейс. Например, администраторы перенаправляются в интерфейс администратора, учителя перенаправляются в интерфейс учителя. У каждого интерфейса есть собственная главная страница и страницы aspx. Новое требование заключается в том, что учителям больше не разрешается просматривать определенную информацию или выполнять определенные функции. Информация может быть полем или строкой в ​​элементе управления gridview, она также может быть функциональной (например, не может щелкнуть ссылку, чтобы открыть всплывающее окно, но по-прежнему видеть текст ссылки). Для других ролей также требуются особые «разрешительные» требования, но они полностью отличаются от требований учителей.

Предлагаемое решение

Создайте таблицу базы данных для централизованного сопоставления permissionsToRoles следующим образом:

CREATE TABLE [dbo].[PermissionToRole](
    [PermissionID] [int] IDENTITY(1,1) NOT NULL primary key,
    [Role] int NOT NULL,
    [Control] [varchar](50) NOT NULL,
    [ControlType] [varchar](50) NOT NULL,
    [Function] [varchar](50) NOT NULL,
    [Read] [bit] NULL,
    [Write] [bit] NULL,
    [Execute] [bit] NULL,
    [Delete] [bit] NULL
)

Используя приведенный выше пример ссылки, мы получим что-то вроде: «учитель», «labelName», «asp: label», «click», 1, 0, 0, 0 (можно прочитать ссылку, но не «выполнить» щелчок)

План состоит в том, чтобы уметь делать несколько вещей:

  1. Используйте разрешения для объединения нескольких aspx и логики на одной странице (aspx). Чтобы сократить обслуживание каждый раз, когда требуется новая роль.
  2. Управление на всех уровнях (вкладка -> управление) с разрешениями ролей или групп. Например. используйте эту таблицу для управления видимостью элементов управления на каждом уровне (вкладка, страница, элемент управления). А также индивидуальные функции (например, нажатие на ссылку)
  3. Управляйте тем, какие данные возвращаются в пользовательский интерфейс и какие операции CRUD разрешены.

Существуют ли платформы для ASP.NET, которые уже могут это сделать? Я почти уверен, что системы управления контентом (CMS) могут это сделать, но это приложение не будет использовать CMS :). Я действительно хочу не изобретать велосипед заново.

Спасибо!


person O.O    schedule 27.09.2011    source источник
comment
ASP.NET не имеет понятия о разрешениях пользователя / группы? Итак, для чего используются поставщики членства и ролей? Вы можете предоставить ACL в файле web.config для ограничения местоположений (страниц, папок).   -  person Luis    schedule 27.09.2011
comment
@Luis - Я обновил свой вопрос. Я не понимаю, насколько здесь уместны ACL. Хотите уточнить?   -  person O.O    schedule 27.09.2011


Ответы (3)


Взгляните на AzMan. У меня такое чувство, что это то, что вы ищете.

С помощью AzMan вы определяете операции и проверяете, авторизован ли пользователь для выполнения операции в коде. Затем вы можете определить, каким ролям разрешено выполнять какие операции, и назначить роли пользователям - поскольку вы проверяете операции, а не роли, никаких изменений кода не потребуется, если вы хотите ввести новую роль или переназначить операции между ролями.

person Dmitry    schedule 27.09.2011
comment
@ subt13 Ну, похоже, вы не можете использовать его при частичном доверии. Но если у вас нет этого ограничения, стоит попробовать. (Однако есть одна особенность: когда он читает XML-хранилище, он блокирует исключительно файл, что может вызвать проблемы. Но последняя версия библиотеки может использовать SQL-сервер в качестве хранилища, поэтому этого можно избежать.) - person Dmitry; 27.09.2011
comment
Пока что ваше решение попадает в цель. Тем не менее, все еще надеемся на альтернативные фреймворки. - person O.O; 27.09.2011

Решил попробовать NetSqlAzMan, потому что:

  • Не COM и IS .NET 4
  • СУБД для хранилища данных
  • АОП (аспектно-ориентированное программирование) (может использовать атрибуты вместо массивных проверок if / else)
  • Слабо связанный
  • Обрабатывает разрешения для сценариев ролей
  • Бесплатно
person O.O    schedule 29.09.2011

По правде говоря, элементы управления членством ASP.net должны иметь возможность что вы хотите. Настройка базы данных с соответствующей схемой позволяет использовать огромный набор методов и объектов для управления доступом пользователей. Как упоминает Луис, вы можете получить доступ к страницам управления и папкам для определенных ролей, но если вы хотите заблокировать отдельные функции в зависимости от роли пользователя, вы можете использовать _ 1_ метод.

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

person Jim Dagg    schedule 27.09.2011
comment
Я думаю, вы путаете роли или группы с разрешениями. Кроме того, контроль доступа к физическим страницам не имеет отношения к моему вопросу. Метод IsUserInRole ограничен проверкой того, находится ли пользователь в одной роли. Очевидно, мне нужно больше этого. Во-первых, мне не хочется загромождать свой код и разметку проверками IsUserInRole. К тому же понадобится что-то вроде IsRoleInPermissions или IsUserInRoleInPermissions :). - person O.O; 27.09.2011
comment
Я? Насколько я понимаю ваш запрос, у вас есть набор ролей, набор разрешений, и между ними существует связь «многие ко многим». Но ни в коем случае пользователь не может быть членом роли и не иметь разрешений этой роли. Если роль пользователя не может выполнять задачу, представленную страницей, у роли не должно быть доступа к странице. Точно так же, если пользователь не может выполнить действие на странице, к которой у него есть доступ, роль следует проверить и запретить. Если вы действительно хотите разбить его на другой уровень, вы можете сами добавить соответствующие таблицы / вызовы Permission и PermissionToRole. - person Jim Dagg; 27.09.2011
comment
Думаю, это объясняет (лучше, чем я могу) причину, по которой я не согласен с вашим решением: lostechies.com/derickbailey/2011/05/24/ - person O.O; 06.10.2011
comment
Я согласен и написал об этом здесь: granadacoder.wordpress .com / 2010/12/01 /. Я ненавижу безопасность, основанную на ролях. - person granadaCoder; 05.01.2012