我的ASP.Net MVC应用程序中有一个metisMenu,我要做的是根据用户AD Group成员资格隐藏一些选项。
该应用目前正在使用Windows集成身份验证(Intranet应用程序)。
这样做的最佳方式是什么?
我假设我可以做一个viewbag选项,如果true或flase显示或隐藏,但这意味着我必须为每个动作编写代码?
菜单是共享布局的一部分,位于
之下 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CCL Support System</title>
<link rel="shortcut icon" type="image/png" href="~/img/favicon.png" />
@*CSS Declerations*@
<link href="~/Content/bootstrap.min.css" rel="stylesheet">
<link href="~/Content/plugins/metisMenu/metisMenu.min.css" rel="stylesheet">
<link href="~/Content/ccl.less" rel="stylesheet" type="text/css">
<link href="~/Content/font-awesome.min.css" rel="stylesheet">
<link href="~/Content/themify-icons.css" rel="stylesheet">
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,800' rel='stylesheet' type='text/css'>
@*JavaScript Declerations*@
<script src="~/Scripts/less.min.js" type="text/javascript"></script>
<script src="~/scripts/jquery-2.1.1.js" type="text/javascript"></script>
<script src="~/scripts/bootstrap.min.js" type="text/javascript"></script>
<script src="~/scripts/plugins/metisMenu/metisMenu.min.js" type="text/javascript"></script>
<script src="~/scripts/sb-admin-2.js" type="text/javascript"></script>
<script src="~/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="~/Scripts/expand.js" type="text/javascript"></script>
</head>
<body class="ccl-body">
<div id="wrapper">
<nav class="navbar navbar-default navbar-fixed-top ccl-header" role="navigation">
<div>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown navbar-profile">
<a style="z-index: 1" href="#" class="dropdown-toggle navbar-profile-icon" data-toggle="dropdown"><span class="ti-settings menu-icon"></span><span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="@Url.Action("Edit", "Profile" )">Edit User Details</a></li>
</ul>
</li>
</ul>
</div>
<div class="logo-box">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="ccl-logo" href="@Url.Action("index", "Home" )"><img src="~/img/logo.png" width="75" height="73" alt="" /></a>
</div>
<div class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<li>
<a href="@Url.Action("index", "Home" )"><span class=" ti-info menu-icon"></span>Information<span class="ti-angle-right menu-carret pull-right"></span></a>
<ul class="nav nav-second-level">
<li>
<a href="@Url.Action("About", "Home")">About</a>
</li>
<li>
<a href="@Url.Action("License", "Home")">Licenses</a>
</li>
<li>
<a href="@Url.Action("Bug", "Home")">Bug Report</a>
</li>
</ul>
</li>
<li>
<a href="@Url.Action("Search", "Password" )"><span class=" ti-key menu-icon"></span>Reset Passsword</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Main Panel -->
<div id="page-wrapper" class="content">
@if (IsSectionDefined("title"))
{
<div id="page-block" class="page-block-header row">
<div class="col-lg-offset-1 col-lg-10">
@RenderSection("title", false)
</div>
</div>
}
@if (IsSectionDefined("subtitle"))
{
<div id="page-block" class="page-block-two row">
<div class="col-lg-offset-1 col-lg-10">
@RenderSection("subtitle", false)
</div>
</div>
}
@RenderBody()
</div>
</div>
<!-- Footer -->
<div class="navbar ccl-footer">
<div class="pull-right">
<p>© 2014 Computer Concepts Ltd</p>
</div>
</div>
</body>
</html>
如果我们更仔细地查看菜单(下面的代码段)
div class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<li>
<a href="@Url.Action("index", "Home" )"><span class=" ti-info menu-icon"></span>Information<span class="ti-angle-right menu-carret pull-right"></span></a>
<ul class="nav nav-second-level">
<li>
<a href="@Url.Action("About", "Home")">About</a>
</li>
<li>
<a href="@Url.Action("License", "Home")">Licenses</a>
</li>
<li>
<a href="@Url.Action("Bug", "Home")">Bug Report</a>
</li>
</ul>
</li>
<li>
<a href="@Url.Action("Search", "Password" )"><span class=" ti-key menu-icon"></span>Reset Passsword</a>
</li>
</ul>
</div>
</div>
我希望隐藏此
中的某些选项什么是最好的方法,我需要创建自定义身份验证类吗?如果有的话,是否有任何关于如何做到这一点的良好链接?
因此最终结果是,如果用户在XYZ AD Group中,则显示
<li>
<a href="@Url.Action("Search", "Password" )"><span class=" ti-key menu-icon"></span>Reset Passsword</a>
</li>
否则隐藏它。
答案 0 :(得分:0)
您可以使用MvcSiteMapProvider的security trimming功能,只需几步即可完成此操作。
自定义/Views/Shared/DisplayTemplates/
文件夹中的模板以符合您的页面布局。
完全披露:我是MvcSiteMapProvider的主要项目贡献者。
如果您不想添加第三方库,则需要做一些工作。您必须创建自己的HTML帮助程序,以响应authorize属性(或类似的东西)。您可以蚕食AuthorizeAttributeAclModule以确定是否显示或隐藏HTML帮助程序节点。