Я использую пользовательские фильтры авторизации для реализации контроля доступа на основе ролей и владельцев. Стандартный AuthorizationFilter позволит вам указать именованные роли или пользователей, которые могут иметь доступ к действию. Я расширил это, чтобы вы могли указать, что текущий пользователь может иметь доступ, если он является «владельцем» данных. У меня есть два дополнительных фильтра, RoleOrOwnerAuthorizationFilter и RoleOrOwnerAssociatedAuthorizationFilter. Сначала проверяется, что настраиваемый параметр (обычно id
), передаваемый в RouteData, является идентификатором текущего пользователя в моей таблице пользователей или если текущий пользователь играет какую-либо из перечисленных ролей. Если это так, проверка завершается успешно, если нет, она возвращает представление об ошибке авторизации.
Второй позволяет мне указать таблицу соединения и параметры, которые будут использоваться для связи параметра в RouteData со столбцом в таблице соединения, а текущий пользователь - с другим столбцом в таблице соединения. Если существует запись, соответствующая как значению параметра, так и пользователю, я заключаю, что пользователь связан с данными и может иметь доступ. Это также разрешает доступ, если вы находитесь в указанной роли. Между этими тремя различными атрибутами у меня есть почти все мои потребности в управлении доступом, что означает, что я применяю безопасность просто путем украшения соответствующим образом настроенным атрибутом.