C# 基于当前用户动态构建ASP.NET MVC母版页菜单';s";角色“;

C# 基于当前用户动态构建ASP.NET MVC母版页菜单';s";角色“;,c#,.net,asp.net,asp.net-mvc,security,C#,.net,Asp.net,Asp.net Mvc,Security,我见过一些类似的问题,但没有一个看起来像我要做的 这是我当前的实现,没有任何安全性: 这很好,上面的方法很有效。我在CController和DController的操作上设置了[Authorize]属性,以防止未经授权的访问——但我想从没有正确角色的用户的菜单中删除这些项目,因为当他们看到并单击它,它告诉他们没有权限时,他们会想要它。如果他们不知道它在那里,那对所有参与的人来说都更好 像这样的东西最终是我想要达到的目标,但我正在寻找更具MVC风格的aproach,其中“视图”是“

我见过一些类似的问题,但没有一个看起来像我要做的

这是我当前的实现,没有任何安全性:


这很好,上面的方法很有效。我在CController和DController的操作上设置了[Authorize]属性,以防止未经授权的访问——但我想从没有正确角色的用户的菜单中删除这些项目,因为当他们看到并单击它,它告诉他们没有权限时,他们会想要它。如果他们不知道它在那里,那对所有参与的人来说都更好

像这样的东西最终是我想要达到的目标,但我正在寻找更具MVC风格的aproach,其中“视图”是“愚蠢的”:


您听说过公司的MenuBuilder吗


如果没有,我建议你去看看。示例项目
UI
是开始学习如何使用它的一个好方法。

我做了如下工作:

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // build list of menu items based on user's permissions, and add it to ViewData
        IEnumerable<MenuItem> menu = BuildMenu(); 
        ViewData["Menu"] = menu;
    }
  • 为我的控制器使用公共基类(“层超类型”)
  • 在BaseController中,重写OnActionExecuted(您还可以为此定义ActionFilter属性)
大概是这样的:

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // build list of menu items based on user's permissions, and add it to ViewData
        IEnumerable<MenuItem> menu = BuildMenu(); 
        ViewData["Menu"] = menu;
    }
受保护的覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文)
{
//基于用户权限生成菜单项列表,并将其添加到ViewData
IEnumerable menu=BuildMenu();
ViewData[“菜单”]=菜单;
}
在母版页中:

    <% var model = ViewData["Menu"] as IEnumerable<MenuItem>; %>
    <% Html.RenderPartial("Menu", model); %>

(注意:事实上,我有一个MasterViewModel,其中包含菜单模型)

像@SD”说的那样,你可以创建一个“闪亮”的助手,根据你的安全要求渲染链接,也可以不渲染链接

以下是有关自定义帮助程序的详细信息(请参阅底部):


通常我只是以与您类似的方式检查角色,然后使用链接呈现部分视图或创建它们。类似于使用Razor语法。我使用T4MVC执行操作

@if(User.IsInRole("Admin"))
{
    <li><a href="@Url.Action(MVC.Admin.User.Index())">Users</a></li>
}
@if(User.IsInRole(“Admin”))
{
  • }
    为了安全,我使用流畅的安全性。
    希望这能有所帮助。

    没有人提到哪个可以这样做,并且可以使用NuGet轻松地集成到您的Visual Studio项目中。

    Joe的解决方案迄今为止是最简单的,对我来说很有效。我的页面位于不同的区域,我需要快速设置一个菜单系统,根据用户所在的区域进行反应和工作。此外,我的系统中没有跨区域链接,因此我将转到下一步


    希望这能帮助其他寻找简单有效解决方案的人!

    我是……我想。有两个级别的用户,普通和管理员。只有管理员才能查看公司和用户列表,[Authorize]控制器上的属性可防止未经授权的访问,但我想对非管理员隐藏视图,这样他们甚至不会认为视图在他们的脑海中。我假设ActionExecutedContext将包含当前用户的信息?我只需要更新我的所有控制器,以从我定义的新基本控制器继承?是的,ActionExecutedContext让你可以访问a.o.HttpContextheh,我觉得自己像一个完整的n00b,但这对我来说是一个新的。谢谢。@jeroenh:所以我在这里开始了另一个线程引用你的答案。基本上,我正试图充实你的答案到一个完整的类中,但我正在努力把它做好。不知道你是否想放弃你的答案2美分。