我在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)说要实施缓存。现在有人可以告诉我它是怎么回事吗?
感谢。
答案 0 :(得分:1)
由于没有内置用户缓存,在请求之间存储页面可访问性设置是不切实际的,更不用说缓存这些设置可能会使它们与当前上下文不同步(例如,如果用户注销)。无需额外的工作来同步缓存和当前的应用程序状态,缓存安全设置始终为黑客提供了一种规避安全性的简便方法。
因此,每个请求的每个节点都会调用一次AuthorizeAttribute。请记住,MVC仅关注当前页面,但MvcSiteMapProvider必须检查所有页面的安全性,以确定要显示和隐藏的节点。但是,使用默认的AuthorizeAttribute时,v4中的安全修整性能已得到显着改善。完成请求缓存以确保每个请求每个节点不会多次调用它。
如果您对AuthorizeAttribute进行了自定义,则应该尽可能快地进行检查,并将任何响应操作委派给处理程序(the same way Microsoft does),而不是在自定义AuthorizeAttribute。
使用自定义AuthorizeAttribute与MvcSiteMapProvider的一个约束是,它必须在授权成功时将actionContext.Response值设置为null,并在失败时将其设置为非null值。