Условие для доступа к методу 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 (...)) {...}.