Фильтры OutputCache и Authorize в MVC3

Я читаю книгу о MVC2, и в разделе OutputCache говорится:

Предупреждение. В предыдущем разделе «Как фильтры авторизации взаимодействуют с кэшированием вывода» я объяснил, что [Авторизация] имеет особое поведение, гарантирующее, что неавторизованные посетители не смогут получить конфиденциальную информацию только потому, что она уже кэширована. Однако, если вы специально не предотвратите это, все еще возможно, что кешированные выходные данные могут быть доставлены другому авторизованному пользователю, отличному от того, для которого они были изначально созданы. Один из способов предотвратить это — реализовать ваш доступ. управления для определенного элемента контента в качестве фильтра авторизации (производного от AuthorizeAttribute) вместо того, чтобы просто применять логику авторизации, встроенную в метод действия, поскольку AuthorizeAttribute знает, как избежать обхода путем кэширования вывода. Тщательно протестируйте, чтобы убедиться, что авторизация и кэширование вывода взаимодействуют так, как вы ожидаете.

Это все еще верно в MVC3?

Если да, то как предотвратить это? (потому что объяснение в книге слишком расплывчатое).

С Уважением.


person vtortola    schedule 18.07.2011    source источник


Ответы (1)


Я думаю, что это.

Когда вы используете OutPutCache для кэширования данных, эти данные кэшируются глобально. Пока пользователь авторизован, он будет получать кэшированные данные.

Да, у нас есть параметры «VaryByParam» для outputcache, но он также создает новый кеш для каждого передаваемого параметра. что означает, что это все еще глобально.

Поэтому, если вы хотите кэшировать разные данные на основе пользователей, outputcache может быть неправильным способом. Если данные зависят от пользователя, правильным выбором будет сеанс. это то, ради чего живет сессия

person fengd    schedule 18.07.2011
comment
Отлично, я все равно назначу награду, так что, может быть, я смогу найти больше объяснений: D Спасибо миллион. - person vtortola; 21.07.2011
comment
Так что, если я использую OutputCacheAttribute.VaryByHeader=Cookie, это будет безопасно с точки зрения авторизации? То, что я хочу кэшировать, — это отображаемая страница, потому что некоторые из них большие и содержат много логики генерации. - person vtortola; 22.07.2011
comment
это вариант. но если информация критична, возможно, вам не следует зависеть от файла cookie, который хранится на стороне клиента. - person fengd; 25.07.2011
comment
Ясно, потому что, если я задаю кеш вывода, вызов не аутентифицируется? Я имею в виду, что cookie не проверяется на действительность? - person vtortola; 25.07.2011
comment
тогда вам просто нужно убедиться, что это файл cookie авторизации, а не другие файлы cookie. - person fengd; 25.07.2011