Я пытался продумать этот ответ и не могу найти хорошее решение о том, как правильно это сделать.
Я прочитал эти статьи:
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, так как он принимает только строку и как определить, для чего она предназначена, а затем ограничивать безопасность на другом уровне, проверяя идентификатор отдела.
Идентификатор отдела необязательно должен быть кэширован, поэтому, возможно, я смогу сделать это на уровне контроллера.