隐藏基于AD组成员身份的菜单选项

时间:2014-11-23 20:30:05

标签: asp.net asp.net-mvc asp.net-mvc-4

我的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>&copy; 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>

否则隐藏它。

1 个答案:

答案 0 :(得分:0)

您可以使用MvcSiteMapProvider的security trimming功能,只需几步即可完成此操作。

  1. 在您的操作方法(支持角色/用户/ AD /表单身份验证)上配置AuthorizeAttribute
  2. 通过NuGet安装MvcSiteMapProvider
  3. Mvc.sitemap XML file和/或使用.NET attributes和/或使用dynamic node providers创建网站的层次结构。
  4. @Html.MvcSiteMap().Menu() HTML helper添加到您的布局页面(或创建您自己的菜单HTML帮助程序,如果它不符合您的需要,它具有类似的功能)。
  5. 自定义/Views/Shared/DisplayTemplates/文件夹中的模板以符合您的页面布局。

  6. 完全披露:我是MvcSiteMapProvider的主要项目贡献者。

    如果您不想添加第三方库,则需要做一些工作。您必须创建自己的HTML帮助程序,以响应authorize属性(或类似的东西)。您可以蚕食AuthorizeAttributeAclModule以确定是否显示或隐藏HTML帮助程序节点。