Подтвердить что ты не робот

Авторизация ASP.NET MVC: разрешения на роль ролей

Я знаю, что это вопрос, который задавался снова и снова, но я пытаюсь реализовать авторизацию на основе разрешений, а не на основе роли в приложении ASP.NET MVC. Поэтому вместо того, чтобы иметь только такие роли высокого уровня, как "Менеджер", "Администратор" или "Пользователь", мне нужны разрешения, такие как ViewTask, AddTask, DeleteTask. Я прочитал массу комментариев по этому поводу, и кажется, что самое простое решение - просто рассматривать роли как разрешения и определять "роли" ViewTask, AddTask и DeleteTask.

Является ли такой подход действительно хорошей идеей? Некоторые из моих проблем заключаются в том, что вы можете получить более 100 ролей в зависимости от размера приложения, которое затем исключило бы возможность выполнять кеширование роли в файлах cookie, и, таким образом, каждый вызов User.IsInRole попадает в базу данных. Если каждый метод действия будет украшен [Authorize (Roles = "XXXX" )], я увижу серьезные проблемы с производительностью?

Моя другая проблема заключается в том, что я все еще хочу сохранить концепцию роли, чтобы администратор мог просто связать пользователя с ролью, которая имеет предопределенный набор разрешений. Используя вышеприведенный подход, я решил создать отдельный объект в моем приложении с именем Group, и эта группа будет отвечать за отслеживание ролей ASP.NET, назначенных этой группе. Поэтому, когда пользователь связан с группой, я могу получить роли ASP.NET, которые должны быть назначены пользователю, и добавить все роли.

Кто-нибудь реализовал систему таким образом? Любые мнения или мысли по этому подходу будут оценены.

Спасибо

4b9b3361

Ответ 1

Я согласен с @jlew о кешировании пользовательских данных и по истечении срока кеша - просто перезагрузите его. Нет смысла пытаться заставить эти данные оставаться постоянными. Кроме того, если вы хотите отойти от поставщиков роли ASP.net, вы можете свернуть свою собственную безопасность, как я описанный в этом ответе. Это имеет то преимущество, что позволяет создавать собственные решения безопасности для ролей/индивидуальных разрешений.

Следующее - это просто идея, с которой я недавно занимался (просто пища для размышлений). Почему бы не использовать URL-адреса RESTful MVC для определения "разрешений". Например:

/tasks/add может определять разрешение для добавления задач. Они могут как-то быть иерархическими, так что предоставление прав пользователя на /tasks/add также дает им разрешения на /tasks. Затем вы можете использовать глобальный фильтр действий, который будет создавать URL-адрес с учетом значений маршрута. Это также позволило бы действительно интересный подход для настройки отдельных элементов безопасности через среду выполнения. Например, /tasks/edit/23 может каким-то образом предоставить разрешения редактирования для задачи с id 23. Во всяком случае, это может быть даже не полезно вообще... но просто подумалось, что я думал, что вы, возможно, подумаете.

Ура!

Ответ 2

Мы решаем проблему путем кэширования принципала на стороне сервера, так что "роли разрешения" не обязательно должны находиться в файле cookie, и нам не нужно повторно загружать каждый запрос. Фактически вы можете обойти ограничение размера файлов cookie, разбивая данные cookie на несколько файлов cookie (это делает Windows Identity Framework). Но у вас может быть полоса пропускания или другие проблемы с большими файлами cookie.