Asp.net mvc MVCSiteMapProvider:使用输出缓存的安全性微调返回空站点地图
我正在使用MvcSiteMapProvider Html帮助程序创建导航栏。导航栏的内容取决于访问者的权限,因此我使用安全微调仅显示授权人员的内容。为了提高性能,我尝试缓存这个导航栏 导航栏在局部视图中创建,包含以下内容:Asp.net mvc MVCSiteMapProvider:使用输出缓存的安全性微调返回空站点地图,asp.net-mvc,caching,outputcache,mvcsitemapprovider,security-trimming,Asp.net Mvc,Caching,Outputcache,Mvcsitemapprovider,Security Trimming,我正在使用MvcSiteMapProvider Html帮助程序创建导航栏。导航栏的内容取决于访问者的权限,因此我使用安全微调仅显示授权人员的内容。为了提高性能,我尝试缓存这个导航栏 导航栏在局部视图中创建,包含以下内容: @Html.MvcSiteMap().Menu("MenuHelper", new { name = "MainMenu" }) 在布局文件中,由返回局部视图的操作方法调用: [System.Web.Mvc.OutputCache(Duration = 10, VaryBy
@Html.MvcSiteMap().Menu("MenuHelper", new { name = "MainMenu" })
在布局文件中,由返回局部视图的操作方法调用:
[System.Web.Mvc.OutputCache(Duration = 10, VaryByCustom = "User")]
[ChildActionOnly]
public ActionResult MainMenu()
{
return PartialView("MainMenu");
}
的缓存在站点地图的根页面上运行良好。但是,当缓存持续时间用完并且从更深层次调用操作方法时,不会返回任何站点地图。
当我禁用安全微调或输出缓存时,它在所有级别都能正常工作
是否有可能在授权数据不可用时调用返回导航栏的操作方法,从而返回损坏的站点地图?如果您分析,您会注意到它不是为处理缓存输出的子操作而设计的(为了确保这一点,它们会花费大量时间)
当然,如果您有一个自定义的AuthorizeAttribute
,它覆盖了不复制此重要逻辑的OnAuthorization
,那么它也不会正常工作
但是,在使用安全性微调时,您可以做一些事情来提高性能:
mvcsitemprovider
,但安全性调整会使这一点更加明显)AuthorizeAttribute
,您可以使用角色
属性/属性将您的角色逻辑复制到站点地图中,并从配置中删除AuthorizeAttribute模块
有关更多详细信息,请参阅。当只有使用布局的操作使用
AuthorizeAttribute而不是子操作时,这是否仍然适用?我从未尝试将mvcsitemprovider
与输出缓存一起使用。我的猜测是这可能行不通。它是动态的,随着每个请求而变化。缓存输出意味着永远不会调用SiteMap
对象,也不会运行每个请求都应该运行的逻辑—有效地绕过了安全微调和可见性提供程序。