Использование ASP.NET MVC OutputCache при изменении просмотра содержимого в зависимости от того, прошел ли пользователь проверку подлинности - PullRequest
5 голосов
/ 10 августа 2010

Я создаю сайт ASP.NET MVC 2, где я интенсивно использую параметр OutputCache. Однако у меня есть проблема: использование такого кэширования может помешать аутентификации .

На всех моих страницах я показываю, вошел ли пользователь в систему или нет. Кроме того, в некоторых моих представлениях я выполняю фильтрацию на основе роли пользователя, чтобы определить, отображать или нет некоторое содержимое страницы (например, ссылка Редактировать на одной из моих страниц отображается только пользователям в роли модератора или администратора).

Будет ли использование OutputCache мешать этому динамическому изменению моих представлений? Если это так, как я могу решить эту проблему, не устраняя кэширование?

Ответы [ 2 ]

8 голосов
/ 10 августа 2010

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

Обратите внимание, что это не зависит от пользователя или роли; это буквально перезапускает оригинальную проверку. Представьте, что пользователь A (который является модератором) входит и вызывает кэширование страницы. Теперь пользователь B (который является администратором) входит и попадает на кэшированную страницу. Проверка [Авторизоваться] будет успешной, поскольку разрешены как Администратор, так и Модератор, а ответ, отправленный Пользователю Б, будет содержать точно такое же содержание , что и ответ, который был отправлен Пользователю А.

Обратите внимание, что подмена ответа не работает в MVC 2. Если вы обслуживаете потенциально конфиденциальные данные, лучше всего не кэшировать их. Если вам абсолютно необходимо кэшировать, вы можете имитировать что-то похожее на подстановку ответа, используя обратный вызов AJAX для динамического заполнения отсутствующих данных.

1 голос
/ 10 августа 2010

Я считаю, что вам нужно кэширование ASP.NET донунта. См. здесь для хорошего объяснения. Я не удивлюсь, если SO использует что-то подобное для верхней панели.

...