Первый вопрос, на который вам нужно ответить: «Когда я смогу принять решение об авторизации?». Когда у вас есть информация, необходимая для проверки?
Если вы почти всегда можете определить доступ к ресурсу по данным маршрута (или другого контекста запроса), тогда политика с соответствующим требованием и обработчиком может быть уместно. Это работает лучше всего, когда вы взаимодействуете с данными, явно выделяемыми ресурсом - поскольку это совсем не помогает в таких вещах, как фильтрация списков, и вам придется вернуться к обязательным проверкам в этих случаях.
Если вы не можете понять, может ли пользователь возиться с ресурсом, пока вы на самом деле не изучите его, то вы в значительной степени застряли с обязательными проверками. Для этого существует стандартная структура , но она не так полезна, как структура политики. Возможно, в какой-то момент полезно написать IUserContext
, который может быть введен в тот момент, когда вы запрашиваете домен (например, в репозитории / везде, где вы используете linq), который инкапсулирует некоторые из этих фильтров (IEnumerable<Order> Restrict(this IEnumerable<Order> orders, IUserContext ctx)
).
Для сложной области не будет легкой серебряной пули. Если вы используете ORM, это может помочь вам - но не забывайте, что навигационные отношения в вашем домене позволят коду нарушать контекст, особенно если вы не были строгими в попытке сохранить агрегаты изолированными (myOrder.Items [ n] .Product.Orderees [notme] ...).
В последний раз, когда я делал это, мне удавалось использовать подход, основанный на политике на маршруте, в 90% случаев, но все же пришлось сделать некоторые ручные императивные проверки для нечетного списка или сложного запроса. Опасность использования императивных проверок, как я уверен, вы знаете, заключается в том, что вы их забываете. Возможное решение для этого - применить [Authorize(Policy = "MatchingUserPolicy")]
на уровне контроллера, добавить дополнительную политику «ISolemlySwearIHaveDoneImperativeChecks» к действию, а затем в вашем MatchUserRequirementsHandler проверить контекст и обойти наивные проверки соответствия пользователя / порядка, если обязательные проверки были выполнены. 'объявил'.