Атрибуты [OutputCache] и [Authorize] хорошо взаимодействуют друг с другом. Метод AuthorizeAttribute.OnAuthorization () устанавливает перехват в системе кэширования вывода, которая заставляет фильтр авторизации перезапускаться до того, как страница будет обслуживаться из кэша. Если логика фильтра авторизации дает сбой, она будет рассматриваться как ошибка кэша. Если логика авторизации выполнена успешно, страница будет обслуживаться из кэша. Поэтому, если у вас есть [Authorize (Roles = "Moderator, Administrator")] и [OutputCache] для действия, страница не будет обслуживаться из кэша, если текущий пользователь не находится в роли модератора или администратора.
Обратите внимание, что это не зависит от пользователя или роли; это буквально перезапускает оригинальную проверку. Представьте, что пользователь A (который является модератором) входит и вызывает кэширование страницы. Теперь пользователь B (который является администратором) входит и попадает на кэшированную страницу. Проверка [Авторизоваться] будет успешной, поскольку разрешены как Администратор, так и Модератор, а ответ, отправленный Пользователю Б, будет содержать точно такое же содержание , что и ответ, который был отправлен Пользователю А.
Обратите внимание, что подмена ответа не работает в MVC 2. Если вы обслуживаете потенциально конфиденциальные данные, лучше всего не кэшировать их. Если вам абсолютно необходимо кэшировать, вы можете имитировать что-то похожее на подстановку ответа, используя обратный вызов AJAX для динамического заполнения отсутствующих данных.