2014-05-15 42 views
1

我有一個使用win auth的項目,我使用「securityTrimmingEnabled」選項來檢測菜單用戶的哪些部分可以訪問。MvcSiteMapProvider問題當爲securityTrimmingEnabled節點設置路由值爲真時

我設置站點地圖結點屬性:

siteMapNode.ParentNode.Title = entity.Parent.Title; 
siteMapNode.ParentNode.RouteValues["id"] = entity.Parent.Id; 

如果「securityTrimmingEnabled」是假的,一切都很好,我有正確的網址映射路徑(/組合/工具/ 57),如果「securityTrimmingEnabled」是真的,節點的標題是好的,但「id」參數不正確(/ portfolio/facility/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);