Asp.net MVC4: авторизация как на контроллере, так и на действии
Если у меня есть атрибут Authorize как на контроллере, так и на действии, какой из них будет иметь эффект? Или оба вступят в силу?
3 ответа:
ты спрашиваешь:
если у меня есть атрибут Authorize как на контроллере, так и на действии, какой из них вступит в силу? Как?
чтобы ответить на это просто: оба. Эффект заключается в
AND
два ограничения вместе. Я объясню почему ниже ...подробности
Итак, есть несколько причин, по которым вы могли бы спросить об этом.
- вы хотите знать, как применить дополнительное ограничение на действие по сравнению с методом. например.
- на уровне контроллера, принудительно использовать пользователей в роли "пользователь"
- на уровне действия дополнительно принудительно используйте пользователей в роли "admin"
- вы хотите заменить ограничение контроллера на уровне действия
- вы хотите удалить ограничение контроллера на уровне действия и сделать метод доступным для анонимных пользователей
вы не указали свою версию MVC, поэтому я буду предположим, что последняя на сегодняшний день (MVC 4.5). Однако это не сильно изменит ответ, даже если вы используете MVC 3.
[Anonymous]
переопределения контроллер[Authorize]
(случай 3)корпус 3. Мне не нужно покрывать (использование
[AllowAnonymous]
) как было отвечено все так и в интернете уже. Достаточно сказать: если вы укажете[AllowAnonymous]
на действии он сделает это действие публичным, даже если контроллер имеет[Authorize]
на нем.вы также можете сделать весь сайт, подлежащие разрешению использовать глобальный фильтр, и использовать
AllowAnonymous
о нескольких действиях или контроллерах, которые вы хотите сделать общедоступными.
[Authorize]
является аддитивным (случай 1)дело 1 легко. Возьмем в качестве примера следующий контроллер:
[Authorize(Roles="user")] public class HomeController : Controller { public ActionResult AllUsersIndex() { return View(); } [Authorize(Roles = "admin")] public ActionResult AdminUsersIndex() { return View(); } }
по умолчанию
[Authorize(Roles="user")]
делает все действия в контроллере доступными только для учетных записей в роли "пользователь". Поэтому для доступаAllUsersIndex
вы должен быть в роли "пользователь". Однако для доступаAdminUsersIndex
вы должны быть как в роли" пользователь", так и в роли" администратор". Например:
- имя пользователя: Боб, роли: пользователь, не может открыть
AdminUsersIndex
, ноAllUsersIndex
- имя пользователя: Джейн, роли: администратор, не может открыть
AdminUsersIndex
илиAllUsersIndex
- имя пользователя: Тим, роли: пользователь и администратор,можете открыть
AdminUsersIndex
иAllUsersIndex
этот иллюстрирует, что
Я хотел бы добавить что-то к переопределению [Authorize] (случай 2)
OverrideAuthorizeAttribute и DefaultAuthorizeAttribute работает нормально, но я обнаружил, что вы также можете использовать OverrideAuthorizationAttribute, который переопределяет фильтры авторизации, определенные на более высоком уровне.
[Authorize(Roles="user")] public class HomeController : Controller { // Available to accounts in the "user" role public ActionResult AllUsersIndex() { return View(); } // Available only to accounts both in the "user" and "admin" role [Authorize(Roles = "admin")] public ActionResult AdminUsersIndex() { return View(); } // Available to accounts in the "superuser" role even if not in "user" role [OverrideAuthorization()] [Authorize(Roles = "superuser")] public ActionResult SuperusersIndex() { return View(); } }
Если использовать его на контроллере, то все методы этого контроллера будут выполнены.
[Authorize] public class SomeController(){ // all actions are effected public ActionResult Action1 public ActionResult Action2
Если вы хотите предотвратить одно из этих действий, вы можете использовать что-то вроде этого:
[Authorize] public class SomeController(){ // all actions are effected public ActionResult Action1 public ActionResult Action2 [AllowAnonymous] public ActionResult Action3 // only this method is not effected...