【问题标题】:Using ASP.NET MVC OutputCache while varying View content based on whether user is authenticated使用 ASP.NET MVC OutputCache 同时根据用户是否经过身份验证改变视图内容
【发布时间】:2011-03-27 12:47:37
【问题描述】:

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

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

使用 OutputCache 会干扰我的视图的这种动态变化吗?如果是这样,我怎样才能在不消除缓存的情况下解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我有一个不需要授权但在用户是版主的情况下在视图中添加编辑链接的方法怎么办?在这种情况下,我正在尝试完成类似于此处问题或答案下的链接、标记、编辑和其他按钮如何工作的事情——难道也不使用 OutputCache 吗?感谢您的回答!
    • 我只是偶然发现了blog.stevensanderson.com/2008/10/15/…(关于一个后来修复的老问题),这给了我一个想法——如果 OutputCache 对此如此糟糕,是否可以构建一个自定义缓存属性/过滤器,它根据用户是否登录以及用户所处的角色创建不同的副本 - 或者更好的是,用户名是什么,因为我要写用户名在页面顶部 - 这可能吗?
    • 按用户缓存通常不是一个好主意,因为您的缓存将被条目淹没。如果甜甜圈缓存对您的方案很重要,您还可以使用响应过滤器。在请求的开头,安装一个能理解一些 [!! SUBSTITUTION DATA !!] 模式,让您的 WriteSubstitute() 将此模式写入响应流,然后在请求结束时,您的过滤器将调用实际的 Response.WriteSubstitution() 方法。
    • 回答你的问题:几乎任何东西(包括用户名)都不同,请参阅aspadvice.com/blogs/ssmith/archive/2007/10/29/…msdn.microsoft.com/en-us/library/…。请记住,虽然不推荐这样做。
    • 在 Jeff Atwood meta.stackexchange.com/questions/60403/… 的建议下,我最终完全切断了对经过身份验证的用户的缓存
    【解决方案2】:

    我相信您需要的是 ASP.NET donunt 缓存。请参阅here 以获得很好的解释。如果 SO 在顶部栏区域使用类似的东西,我不会感到惊讶。

    【讨论】:

    • 部分缓存在 MVC 3 中再次可用!哇!
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2015-04-20
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多