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

Max*_*sky 5 c# asp.net asp.net-mvc caching outputcache

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

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

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

Lev*_*evi 8

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

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

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

  • 如果我有一个不需要授权的方法,但如果用户是主持人,则在View中添加一个Edit链接怎么办?在这种情况下,我正在尝试完成一些类似于问题或答案下的链接,标记,编辑和其他按钮的工作原理 - 是不是也使用OutputCache?感谢您的回答! (2认同)