Как продлить/архивировать атрибут авторизации ASP.NET MVC 3 для обработки этого сценария

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

Я прочитал эти статьи:
http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/
http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx
Пользовательская авторизация ASP.NET MVC
http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx
Пользовательский авторизовать атрибут дополнительного параметра?

Думаю, может быть, последний близок.


Сценарий:

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

Итак, в контроллере, как я могу сказать, что у пользователя есть доступ к действию, так как я не знаю, каковы роли, созданные пользователем User Admin?

Итак, в логике... скажем, у меня есть контроллер задачи с "Create", "Details". Задача имеет отдел "Одежда".

  • Задача:
    - TaskID
    - TaskTitle
    - TaskDepartmentID

  • - Пользователь:
    - UserName
    - Роли
    - Отделы


    Я бы как-то связал действие "Создать" с возможностью "Создать задачу"
    Я бы как-то связал действие "Подробности" с возможностью "Просмотр сведений о задаче"

Администратор добавит новую роль под названием "Пользователи задачи" и скажет, что эта роль может "Создать задачи"
Администратор также разрешил этой роли "Просмотреть сведения о задаче"
Администратор включит "Безопасность уровня отдела"


Создание:
Когда вызывается Task Create на контроллере, мне нужно убедиться, что пользователь находится в роли, которая позволяет "Создать задачу". Поэтому по умолчанию я не могу отправить "Роли", разрешенные в атрибут авторизации, потому что я их не знаю. Мне как-то нужно отправить все роли, которые есть у пользователя, и посмотреть, имеет ли роль доступ к "Создать задачи",

Просмотр с безопасностью отдела.
Когда другой пользователь отправляется на просмотр этой задачи, у них может быть доступ к "Просмотр сведений о задаче" (который я могу выяснить, однако, я разрешаю первую проблему). Однако, поскольку Задача предназначена для другого отдела, кроме того, в котором они находятся, мне нужно запретить доступ. Пользователь может только "просмотреть сведения о задаче", если Задача является частью одного из Департамента, в котором находится Пользователь.

Это то, чего я не могу понять. Как правильно расширить атрибут AuthorizeAttribute, чтобы я мог отправлять список ролей через GerRolesForUser, так как он принимает только строку и как определить, для чего она предназначена, а затем ограничивать безопасность на другом уровне, проверяя идентификатор отдела.

Идентификатор отдела необязательно должен быть кэширован, поэтому, возможно, я смогу сделать это на уровне контроллера.

Ответ 1

У меня была похожая проблема, и я не использовал атрибут Authorize.

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

Ответ 2

У меня была похожая проблема, и я не использовал атрибут Authorize.

Вместо этого я решил взять разный макет для другого пользователя.

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