Как лучше всего проверить, есть ли у пользователя правильные права на выполнение действия?
У меня есть пара способов, некоторые из которых мне нравятся больше других:
1) Используйте атрибут PrincipalPermission
, который прост и очень мало записан в LOC.Основным недостатком является то, что для внесения каких-либо изменений в систему безопасности требуется выпуск кода (и тестирование).
2) Используйте атрибут Authorize
, который, по-видимому, в основном совпадает (по крайней мере, в этом случае) сPrincipalPermission
attribute.
3) Используйте пользовательский атрибут (как обсуждено здесь ) и считывайте конфигурацию из файлов web.config в классическом ASP.NET.Преимущество этого заключается в гибкости, но мне не нравится объем кода, который мне нужно сгенерировать для чтения в конфигурации.
4) Используйте пользовательский атрибут и считывайте информацию о роли из базы данных.Аналогично предыдущему варианту, но из базы данных.Я более склонен идти по этому пути, потому что он дает максимальную гибкость пользователям, но также требует, чтобы я назначил хотя бы одного человека для изменения разрешений.Это может быть затруднено / раздражающе при использовании олицетворения, так как «admin» может не существовать в будущем.
5) Используйте либо метод web.config, либо db, но вместо уровня атрибута сделайтебазовый метод в базовом классе контроллера, который позволяет легко проверять роли.Это создает дополнительный код в каждом отдельном методе действия и на самом деле не дает никаких преимуществ, кроме как избегать метода OnActionExecuted
(для целей захвата).
6) Что-то еще, что я пропустил ...
Так какой вариант лучше?Здесь следует помнить, что, по крайней мере, в моем случае внесение изменений в код требует проведения тестирования, которое может быть длительным и затянутым процессом.Возможность избежать перестройки кода кажется (для меня) большим преимуществом, хотя я полагаю, что он служит цели даже при изменениях безопасности.
(Кстати, я вижу кнопку вики сообщества и предупреждение о субъективности, но я не уверен, стоит ли мне проверять это или что.)