0

我有两种用户类型
- -Admin
-Visitor
如果用户类型是“访问者”,那么 Sub1 节点将不会出现在菜单中。但下面的代码无法隐藏/删除特定节点。
我的站点地图如下所示:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Site Map Test" controller="SitemapTest"action="Index" key="sitemaptestnode"> 
<mvcSiteMapNode title="Sub1" controller="SitemapTest" action="Sub1" key="Childsitemaptestnode1" visibility ="false"/>
<mvcSiteMapNode title="Sub2" controller="SitemapTest" action="Sub2" key="Childsitemaptestnode2"/>
<mvcSiteMapNode title="Sub3" controller="SitemapTest" action="Sub3" />
</mvcSiteMapNode>
</mvcSiteMapNode>

从我调用的 Layout.cshtml

@Html.Action(“RenderMenu”,”Menu”);


Public void RenderMenu(){
var node = MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("Childsitemaptestnode1");
If (node.title =="Sub1"){
//Function to get the user type from database
String UserType=GetUserTypes();
If(UserType=="Visitor"){
//Hide Sub1 node from Menu
node.Attributes["visibility"]="!*";  }  
}}
4

1 回答 1

0

处理此问题的最常见方法是使用基于组的安全性并使用AuthorizeAttribute

但是,在这个简单的场景中,您甚至不需要组。添加AuthorizeAttribute到您的操作方法将自动拒绝任何未登录的用户。

    [Authorize]
    public ActionResult Sub1()
    {
        return View();
    }

这假设您已经设置了一个安全框架来实现IPrincipalIIdentity(ASP.NET Identity 和 Membership 都这样做)。您可以通过使用 Visual Studio 创建的默认模板之一并将相关位(AccountControllerManageController、相关视图和相关启动代码)复制到项目中来获取这些选项之一的基本框架。

所需要的MvcSiteMapProvider只是启用安全修整

内部 DI (web.config)

<appSettings>
    <add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
</appSettings>

外部 DI(MvcSiteMapProvider 模块)

bool securityTrimmingEnabled = true; // Near the top of the module

这将使节点在用户无权访问时自动隐藏,并且AuthorizeAttribute实际上会保护 URL,因此用户无法直接导航到那里。

更改链接的可见性并不能保护任何东西,但如果这就是您想要的,您应该参考文档的可见性提供程序部分。

于 2016-04-08T15:48:54.917 回答