2014-11-23 113 views
0

我在我的ASP.Net MVC应用程序中有一个metisMenu,我正在做的是隐藏一些基于用户AD组成员身份的选项。隐藏基于AD组成员身份的菜单选项

该应用程序当前正在使用Windows集成身份验证(Intranet应用程序)。

这样做的最好方法是什么?

我假设我可以做一个viewbag选项,然后如果真或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组则显示

<li> 
          <a href="@Url.Action("Search", "Password")"><span class=" ti-key menu-icon"></span>Reset Passsword</a> 
         </li> 

否则隐藏它。

+0

你可以创建你自己的'ActionFilter',增加了一个'ViewBag'属性(全球注册的话),或使用'@ Html.Action()'调用呈现菜单(其中该方法决定了一个孩子的行动显示基于用户角色) – 2014-11-23 22:35:10

回答

0

您可以使用MvcSiteMapProvider的security trimming功能在几个步骤中执行此操作。

  1. 在您的操作方法(支持roles/users/AD/forms authentication)上配置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/文件夹中的模板以符合您的页面布局。

披露:我MvcSiteMapProvider的重大项目贡献者。

如果你不想添加第三方库,这需要做一些工作。你将不得不创建自己的HTML助手来响应授权属性(或类似的东西)。您可以调整AuthorizeAttributeAclModule以确定是否显示或隐藏您的HTML帮助程序节点。

+0

好的,有没有关于此的任何文档?我不反对使用第三方库,只要有一些支持和文档 – 2014-11-23 22:09:12

+0

我更新了我的问题(更多)链接到文档。关于安全修剪的文档是[here](https://github.com/maartenba/MvcSiteMapProvider/wiki/Security-Trimming),并有一个初学者的教程[在这里](http://www.shiningtreasures.com/post/2013/08/07/MvcSiteMapProvider-40-A-测试驱动器)。 – NightOwl888 2014-11-23 23:41:18