我有win auth的项目,我使用" securityTrimmingEnabled"用于检测菜单用户可以访问的部分的选项。
我设置了站点地图节点属性:
siteMapNode.ParentNode.Title = entity.Parent.Title;
siteMapNode.ParentNode.RouteValues["id"] = entity.Parent.Id;
如果" securityTrimmingEnabled"是假的,一切都好,我在地图路径中有正确的网址(/ portfolio / facility / 57),如果" securityTrimmingEnabled"是的,节点的标题是可以的,但" id" param不正确(/ portfolio / facility / 0)
我如何解决这个问题?
答案 0 :(得分:2)
这基本上是同一个问题described here。
AuthorizeAttributeAclModule正在访问Url属性并导致它被请求缓存,因此之后设置影响URL的属性(例如在控制器操作中)无效。
选项1
将设置RouteValues [“id”]的代码移动到IDynamicNodeProvider实现中。这将在应用程序启动时(以及缓存过期时)将值加载到共享缓存中,但它也会在AuthorizeAttributeAclModule触发之前加载它们。
选项2
按照here所述,将设置值的代码移动到Application_BeginRequest事件中。
选项3
创建RequestCacheableSiteMapNode的自定义实现,不覆盖Url属性,自定义SiteMapNodeFactory提供新类的实例,然后将它们注入DI。
选项4
手动删除Url属性的请求缓存值,以便下次访问Url属性时重新生成它。
var parentNode = siteMapNode.ParentNode;
parentNode.Title = entity.Parent.Title;
parentNode.RouteValues["id"] = entity.Parent.Id;
var urlRequestCacheKey = "__MVCSITEMAPNODE_" + parentNode.SiteMap.CacheKey + "_" + parentNode.Key + "_Url_True_";
this.HttpContext.Items.Remove(urlRequestCacheKey);