Asp.net MVC4: авторизация как на контроллере, так и на действии


Если у меня есть атрибут Authorize как на контроллере, так и на действии, какой из них будет иметь эффект? Или оба вступят в силу?

3 64

3 ответа:

ты спрашиваешь:

если у меня есть атрибут Authorize как на контроллере, так и на действии, какой из них вступит в силу? Как?

чтобы ответить на это просто: оба. Эффект заключается в AND два ограничения вместе. Я объясню почему ниже ...

подробности

Итак, есть несколько причин, по которым вы могли бы спросить об этом.

  1. вы хотите знать, как применить дополнительное ограничение на действие по сравнению с методом. например.
    • на уровне контроллера, принудительно использовать пользователей в роли "пользователь"
    • на уровне действия дополнительно принудительно используйте пользователей в роли "admin"
  2. вы хотите заменить ограничение контроллера на уровне действия
  3. вы хотите удалить ограничение контроллера на уровне действия и сделать метод доступным для анонимных пользователей

вы не указали свою версию 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...