这是我的问题。我已经定义了带有一个项目和两个子菜单项的菜单。请注意,第一个子菜单项定义了与其父级相同的操作方法。我还在两种操作方法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>
感谢您的任何帮助。
不幸的是,安全修整的行为(基本上是从 ASP.NET 2.0 中复制的)不允许这样做。因此,解决方法是使用可见性提供程序通过包装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,并特别注意配置的可见性提供程序部分。请注意,这与多个可见性提供程序的配置文档相关。