这是我的问题。我已经定义了一个项目和两个子菜单项目的菜单。请注意,第一个子菜单项已定义与其父级相同的操作方法。 我还在两个操作方法Test1,Test2上添加了AuthorizeAttribute。
当用户无法访问Test2方法时,然后"子菜单项2"没有在UI上呈现,这是好的。 但是,当用户无权访问Test1方法"顶级菜单项"并且它的孩子没有被渲染。所以整个菜单都消失了。
我想要"顶级菜单项"用户有权访问任何子菜单项时呈现。它是否适用于MVBSiteMapProvider?
mvc.sitemap文件
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0" xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">
<mvcSiteMapNode title="Home" controller="Home" action="Index" mainnav="false">
<mvcSiteMapNode title="Top menu item" controller="Test" action="Test1" >
<mvcSiteMapNode title="Submenu item 1" controller="Test" action="Test1" />
<mvcSiteMapNode title="Submenu item 2" controller="Test" action="Test2" />
</mvcSiteMapNode>
</mvcSiteMapNode>
感谢您的帮助。
答案 0 :(得分:0)
不幸的是,安全修整的行为(基本上是从ASP.NET 2.0复制的)并不允许这样做。因此,解决方法是使用visibility provider来管理安全性,方法是包装IAclModule
,并禁用安全修整。
public class AclModuleVisibilityProvider
: SiteMapNodeVisibilityProviderBase
{
public AclModuleVisibilityProvider(
IAclModule aclModule
)
{
if (aclModule == null)
throw new ArgumentNullException("aclModule");
this.aclModule = aclModule;
}
private readonly IAclModule aclModule;
public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
{
return this.aclModule.IsAccessibleToUser(node.SiteMap, node);
}
}
使用时,您需要使用外部DI容器。请参阅此处的演示:https://github.com/NightOwl888/MvcSiteMapProvider_355,并特别注意配置的visibility providers部分。请注意,这与configuration documentation for multiple visibility providers相关联。