我有在ASP.NET MVC项目呈现下拉菜单设置MVC网站地图提供商。 我将其配置为使用安全性修剪
<add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
它按预期工作,即不显示在该用户不必进入菜单节点。 不过,我调试的应用程序,我可以看到,在每个页面重新加载,在AuthorizeAttribute断点被击中X + 1次,其中X是在菜单中渲染节点的数量(+1是实际HTTP请求)。
默认情况下,缓存持续时间参数设定为5分钟。 我也曾尝试明确设置参数在Web.config(以防万一)
<add key="MvcSiteMapProvider_CacheDuration" value="60" />
它看起来像高速缓存未在安全上下文中启用。
我看到这个旧帖子(2010年)说,缓存为实施。 谁能告诉我是怎么回事现在?
谢谢。
由于没有内置的用户缓存,这将是不实际的请求之间的商店页面辅助功能设置,更何况缓存这些设置可能使他们不同步当前上下文(例如,如果用户注销)。 如果没有做额外的工作来同步缓存和当前应用状态,缓存安全设置总是提供黑客绕过安全性的简单方法。
所以AuthorizeAttribute被称为每个节点一个时间上的每个请求。 请记住,只有MVC关注于当前页面,但MvcSiteMapProvider必须以确定哪些节点,以显示和隐藏检查所有网页的安全性。 然而,安全性修剪性能得到了显着的V4使用默认AuthorizeAttribute时提高。 请求缓存做是为了确保它不叫大于每请求节点一次。
如果您已自定义设置AuthorizeAttribute ,你应该照顾,使检查尽可能快和委托任何响应行动,处理程序( 以同样的方式微软确实 )而不是自定义AuthorizeAttribute内这样做。
使用带有MvcSiteMapProvider定制AuthorizeAttribute的一个限制是它必须设置actionContext.Response值时,授权成功和失败时一个非空值设置为null。