У меня есть приложение ASP.NET MVC с использованием атрибутов авторизации на контроллерах и действиях. Это хорошо работает, но появилась новая морщина.ASP.NET MVC: авторизация внутри Action - предлагаемые шаблоны или это запах?
объект: Пересылка
Роли: Доставка, бухгалтерский учет, Общий пользователь
пересылка перемещается через рабочий процесс. В состоянии А его можно отредактировать только по отгрузке. В состоянии B он может быть отредактирован только по бухгалтерскому учету.
У меня есть ShipmentController и действие Edit. Я могу поместить атрибут авторизации, чтобы ограничить действие «Правка» только этими двумя ролями, но это не отличает, из какого состояния находится отправка. Мне нужно будет сделать некоторую авторизацию внутри действия перед вызовом службы, чтобы определить, является ли пользователь действительно разрешено выполнять действие редактирования.
Так я остался с двумя вопросами:
1) Что хороший способ получить разрешение внутри действий. Действие контроллера вызывает службу, а затем служба выполняет соответствующие вызовы для объекта «Отгрузка» (количество обновлений, дата обновления и т. Д.). Я точно знаю, что я хочу, чтобы объект отправки был агностик любых требований авторизации. С другой стороны, у меня нет реального понимания, если я хочу, чтобы объект службы знал об авторизации или нет. Есть ли хорошие шаблоны для этого?
2) Является ли моя проблема на самом деле симптомом плохого дизайна? Вместо ShipmentController я должен иметь StateAShipmentController и StateBShipmentController? У меня нет полиморфизма, встроенного в объект Shipment (состояние - это просто перечисление), но, возможно, мне следует и, возможно, контроллеры должны это отразить.
Я предполагаю, что я использую более общие решения, а не конкретные для моего случая. Я просто хотел привести пример, чтобы проиллюстрировать вопрос.
Спасибо!
Почему бы не создать свой собственный фильтр [Authorize], подобный фильтру для связанных вещей? –
создание собственного фильтра [Authorize] было бы действительно очень плохой идеей, и именно команда разработчиков ASP.NET MVC действительно действительно сильно обескуражила –
@Josh; Я не согласен. Это не «действительно, очень плохая идея», это только тот, к которому следует относиться с должной осторожностью. Я не видел публичных статей об обескураживании, а тем более с несколькими «действительно и сильно». Единственное реальное «получение» от моего знания - это то, что вы хотите унаследовать атрибут Authorize, предоставленный инфраструктурой, потому что таким образом вы можете гарантировать, что он надежно уволен в нужном месте. – Paul