2010-08-09 12 views
5

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

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

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

ответ

8

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

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

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

+2

Что делать, если у меня есть метод, который не требует авторизации, но добавляет ссылку «Редактировать» внутри представления, если пользователь является модератором? В этом случае я пытаюсь выполнить что-то похожее на то, как работают ссылки, флаг, редактировать и другие кнопки в вопросе или ответе, - не использует SO OutputCache тоже? Спасибо за Ваш ответ! –

+0

Я просто наткнулся на http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/ (о старой проблеме, которая была позже исправлена), что дало мне представление - если OutputCache так плох с этим, возможно ли ** создать собственный атрибут/фильтр кэширования **, который создает разные копии на основе того, был ли пользователь зарегистрирован и какие роли у пользователя есть, или еще лучше, что имя пользователя есть, поскольку я собираюсь написать имя пользователя в верхней части страницы - ** возможно ли это? –

+0

Как правило, плохая идея кэшировать каждого пользователя, так как ваш кеш будет заполнен записями. Если кэширование пончиков важно для вашего сценария, вы также можете использовать фильтр ответов. В начале запроса установите фильтр, который понимает некоторые [!! ПАРАМЕТРЫ ЗАДАЧИ!], Напишите этот шаблон в потоке ответа, а затем в конце запроса ваш фильтр вызовет фактический метод Response.WriteSubstitution(). – Levi

0

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

+1

Эта ссылка говорит, что это не рекомендуется делать в MVC2 ... –

+0

Частичное кэширование доступно снова в MVC 3! Woot! – madcapnmckay