Авторизовать атрибут в порядке MVC, приоритет и функциональный вопрос - PullRequest
5 голосов
/ 12 января 2011

В ролях есть что-то, чего я точно не понимаю. используя атрибут [Authorize]

Если у вас есть атрибут [Authorize] на контроллере и в действии:

  1. Когда роль в обеих ролях, эта роль будет иметь доступ
  2. Когда роль определена только в контроллере, но не в действии, нет доступа
  3. Когда роль определена только в действии, но не в контроллере, нет доступа

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

Я не понимаю, почему это не работает:

[Authorize(Roles = "Algemeen Beheer, Admin, Coordinator, Secretariaat")]
public class FacturatieGegevensController : Controller {

    [Authorize(Users = "Stefan.coordinator", Roles = "Algemeen Beheer, Admin")]
    public ActionResult Create(int instID) {

        return View();
    }

}

Когда я вошел в систему как пользователь Stefan.coordinator с ролью coordinator, я могу получить доступ к контроллеру, но не могу получить доступ к действию Create. Я думал, что это будет отношение ИЛИ между Users и Roles. Это не? и как мне заставить это работать?

Ответы [ 2 ]

7 голосов
/ 12 января 2011

Условие для доступа к методу Create:

((ROLE в {Algemeen Beheer, Admin, Coordinator, Secretariaat})) [с уровня контроллера] AND((ПОЛЬЗОВАТЕЛЬ в {Stefan.coordinator}) И (РОЛЬ в {Algemeen Beheer, Admin})) [с уровня метода]

Как только все AND / OR имеютбыло получено просто:

ПОЛЬЗОВАТЕЛЬ в {Stefan.coordinator} И РОЛЬ в {Algemeen Beheer, Admin}

То есть в пределах определенного AuthorizeAttribute, пользователи и роли объединяются.И для нескольких AuthorizeAttributes условия объединяются в AND.

Лучший способ думать об этом - атрибуты [Authorize] не знают друг друга, поэтому каждый из них выполняется независимо.Сначала идет первый уровень контроллера, затем первый уровень метода.Чтобы получить доступ к методу, вам нужно пройти все ворота.

Редактировать - возник вопрос о том, как работает логика, как и выше.

Позвольте:

A = ROLE is "Algemeen Beheer"
B = ROLE is "Admin"
C = ROLE is "Coordinator"
D = ROLE is "Secretariaat"
E = USER is "Stefan.coordinator"

Поскольку атрибутом [Authorize] уровня контроллера является (A || B || C || D), атрибутом [Authorize] уровня метода является (E && (A || B))), и несколько атрибутов [Authorize] представлены логическим И, логика заканчивается как (A || B || C || D) && (E && (A || B)), что сводится к E &&(A || B), который требует, чтобы пользователь был назван «Stefan.coordinator» и , чтобы быть в роли «Algemeen Beheer» или «Admin».Поскольку пользователь Stefan.coordinator не входит ни в одну из этих двух ролей, проверка не пройдена.

К вашей конкретной проблеме ..

Если вы хотите применить своюСобственная логика проверяет атрибут [Authorize], создает подкласс AuthorizeAttribute и переопределяет метод AuthorizeCore.Таким образом, вы можете сказать, если (User == "Stefan.coordinator" || base.AuthorizeCore (...)) {...}.

0 голосов
/ 12 января 2011

Значение [Authorize], заданное на уровне контроллера, является значением по умолчанию, используемым, когда для отдельного метода действия не указано [Authorize].

Оба не работают вместе, ибудет выполняться только один.

Если вы укажите и пользователя, и роли в фильтре [Authorize], то оба должны быть удовлетворены, чтобы разрешить доступ к методу.

Поэтомуэто AND , а не OR.

...