Запретить кэширование атрибутов в ASP.NET MVC, принудительное выполнение атрибутов при каждом выполнении действия - PullRequest
5 голосов
/ 18 сентября 2009

Согласно различным статьям (например, здесь и здесь ) результаты в ASP.NET MVC Действия могут быть кэшированными и не выполняется снова когда вызывается действие контроллера.

Такое поведение нежелательно в моем случае (например, у меня есть система авторизации, основанная на моих собственных атрибутах и ​​IP-адресах, проверка ролей, которую необходимо выполнять каждый раз, и другие вещи).

Как я могу запретить ASP.NET MVC кэшировать мои атрибуты / результаты выполнения атрибутов и гарантировать, что они выполняются каждый раз ?

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Посмотрите исходный код для AuthorizeAttribute (в Codeplex или через Reflector), чтобы увидеть, как происходит отключение кэширования для авторизованных страниц. Я реорганизовал его в отдельный метод для моего пользовательского атрибута авторизации, который происходит от AuthorizeAttribute.

protected void CacheValidateHandler( HttpContext context, object data, ref HttpValidationStatus validationStatus )
{
    validationStatus = OnCacheAuthorization( new HttpContextWrapper( context ) );
}

protected void SetCachePolicy( AuthorizationContext filterContext )
{
    // ** IMPORTANT **
    // Since we're performing authorization at the action level, the authorization code runs
    // after the output caching module. In the worst case this could allow an authorized user
    // to cause the page to be cached, then an unauthorized user would later be served the
    // cached page. We work around this by telling proxies not to cache the sensitive page,
    // then we hook our custom authorization code into the caching mechanism so that we have
    // the final say on whether a page should be served from the cache.
    HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
    cachePolicy.SetProxyMaxAge( new TimeSpan( 0 ) );
    cachePolicy.AddValidationCallback( CacheValidateHandler, null /* data */);
}
1 голос
/ 18 сентября 2009

Я только что закончил оживленное обсуждение с Крейгом Штунцем (автором первой статьи, которую вы перечислили).

В итоге я использовал AuthorizeAttribute с AuthorizeCore, чтобы гарантировать, что авторизация вызывается даже в том случае, если страница кэшируется.

...