根据用户是否经过身份验证,在改变View内容的同时使用ASP.NET MVC OutputCache

时间:2010-08-09 21:11:34

标签: c# asp.net asp.net-mvc caching outputcache

我正在构建一个ASP.NET MVC 2站点,我正在大量使用OutputCache参数。但是,我有一个问题:使用这样的缓存可能会干扰身份验证

在我的所有页面上,我显示用户是否已登录。此外,在我的一些观看中,我根据用户角色进行过滤,以确定是否显示某些页面内容(例如,我的某个页面上的编辑链接仅显示给用户主持人或管理员的角色。

使用OutputCache是​​否会干扰我的视图动态更改?如果是这样,如何在不消除缓存的情况下解决此问题?

2 个答案:

答案 0 :(得分:8)

[OutputCache]和[Authorize]属性可以很好地相互配合。 AuthorizeAttribute.OnAuthorization()方法将挂钩设置到输出缓存系统中,该挂钩系统强制授权过滤器在从缓存提供页面之前重新运行。如果授权过滤器逻辑失败,则将其视为高速缓存未命中。如果授权逻辑成功,则将从缓存提供页面。因此,如果您对某个操作有[授权(Roles =“主持人,管理员”)]和[OutputCache],则除非当前用户处于主持人或管理员角色,否则不会从缓存中提供该页面。

请注意,因用户或角色而异;它确实重新运行原始支票。想象一下,用户A(谁是主持人)进来并导致页面被缓存。现在,用户B(谁是管理员)进入并点击缓存页面。由于允许管理员和主持人,[授权]检查将成功,并且提供给用户B的响应将包含与提供给用户A的响应完全相同的内容

请注意,响应替换在MVC 2中不起作用。如果您正在提供潜在的敏感数据,那么最好的选择是不要缓存它。如果你绝对需要缓存,你可以通过使用AJAX回调动态填充缺失的数据来模仿类似于响应替换的东西。

答案 1 :(得分:1)

我相信你需要的是ASP.NET donunt缓存。有关详细解释,请参阅here。如果SO在顶部酒吧区域使用类似的东西,我不会感到惊讶。