Ответ 1
ActionFilter, вероятно, является хорошей отправной точкой, но в зависимости от вашей архитектуры вы можете подумать, достаточно ли защищена защита периметра.
Если вы по существу создаете однослойное приложение ASP.NET MVC (и для этого могут быть вполне разумные причины), ActionFilter обеспечит защиту, которая будет достаточно хорошей, и в то же время очень просто применить.
С другой стороны, если ваше приложение является многоуровневым приложением, защита в глубину более подходит. В этом случае вам следует рассмотреть возможность применения логики авторизации в модели домена или, возможно, даже на уровне доступа к данным. Это гарантирует, что если вы когда-либо разрабатываете другое приложение на основе той же модели домена (например, веб-службы), логика авторизации все равно будет применяться.
Независимо от того, что вы делаете, я настоятельно рекомендую вам основать фактическую реализацию авторизации на IPrincipal.
В более конкретной заметке, о чем вы спрашиваете, лучше всего смоделировать с помощью авторизации на основе ACL: установите ACL для каждого профиля пользователя, который по умолчанию предоставляет доступ только к самому пользователю и администратору. Если вам когда-либо понадобится развернуть приложение, чтобы разрешить делегированный доступ к профилям других пользователей (я не знаю, является ли это даже отдаленно реалистичным в вашем конкретном случае), вы можете просто сделать это, добавив новую запись в ACL.
В таком случае оценка доступа включает в себя получение ACL для запрошенного ресурса и проверку того, включен ли текущий пользователь (IPrincipal) в этот ACL. Такая операция, скорее всего, будет включать операции вне процесса (поиск ACL в базе данных), поэтому включение ее в неявную часть приложения, скрывая ее за ActionFilter, похоже, может потенциально скрыть некоторые проблемы с производительностью. В таком случае я бы подумал о том, чтобы сделать модель авторизации немного более эксплицитной/видимой.