【问题标题】:MVC SiteMap Provider Security Trimming + CacheMVC SiteMap Provider 安全修剪+缓存
【发布时间】:2014-09-17 14:13:43
【问题描述】:

我在 ASP.NET MVC 项目中设置了 MVC SiteMap Provider 以呈现下拉菜单。我将其配置为使用安全修剪

<add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>

它按预期工作,即在菜单中不显示用户无权访问的节点。但是,我正在调试应用程序,我可以看到每次重新加载页面时,AuthorizeAttribute 中的断点都会被命中 X+1 次,其中 X 是菜单中呈现的节点数(+1 是实际的HTTP 请求)。

默认情况下,缓存持续时间参数设置为 5 分钟。我也尝试在 Web.config 中显式设置参数(以防万一)

<add key="MvcSiteMapProvider_CacheDuration" value="60" />

似乎没有在安全上下文中启用缓存。

saw this old post (from 2010) 说要实现缓存。谁能告诉我现在怎么样了?

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    由于没有内置的用户缓存,因此在请求之间存储页面可访问性设置是不切实际的,更不用说缓存这些设置可能会使它们与当前上下文不同步(例如,如果用户注销)。无需做额外的工作来同步缓存和当前应用程序状态,缓存安全设置始终为黑客提供了一种绕过安全性的简单方法。

    因此,在每个请求中每个节点都会调用一次 AuthorizeAttribute。请记住,MVC 只关注当前页面,但 MvcSiteMapProvider 必须检查所有页面的安全性以确定要显示和隐藏的节点。但是,在使用默认 AuthorizeAttribute 时,v4 中的安全修整性能得到了显着提高。完成请求缓存以确保每个节点每个请求不会多次调用它。

    如果您已对 AuthorizeAttribute 进行了自定义,则应注意尽快进行检查并将任何响应操作委托给处理程序 (the same way Microsoft does),而不是在自定义 AuthorizeAttribute 中这样做。

    将自定义 AuthorizeAttribute 与 MvcSiteMapProvider 一起使用的一个限制是它必须在授权成功时将 actionContext.Response 值设置为 null,而在授权失败时设置为非 null 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2012-08-17
      • 2019-09-02
      • 2012-04-04
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多