基于当前用户的“角色”动态构建ASP.NET MVC主页面菜单

我见过一些类似的问题,但没有一个看起来像我正在尝试做的事情。

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

 

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

这样的事情最终是我想要达到的目标,但我正在寻找更多MVC风味的方法,其中“视图”是“愚蠢的”:

  

我做过这样的事情:

  • 为我的控制器使用一个公共基类(’layer supertype’)
  • 在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 menu = BuildMenu(); ViewData["Menu"] = menu; } 

在母版页中:

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

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

你听说过MvcContrib的MenuBuilder吗?

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

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

通常我只是以你做过的方式检查角色,然后用链接渲染局部视图或者只是创建它们。 使用Razor语法这样的东西。 我使用T4MVC进行操作。

 @if(User.IsInRole("Admin")) { 
  • Users
  • }

    为了安全起见,我使用了Fluent Security。 希望这可以帮助。

    就像@SD“所说,你可以创建一个”shiny的“帮助器,根据你的安全要求,不管是否渲染链接。

    这里有一个关于自定义助手的好读物(底部):

    在S. Walther的博客上了解-html-helpers

    到目前为止,乔的解决方案是最简单的,对我有用。 我的页面存在于不同的区域,我需要快速设置一个菜单系统,根据用户所在的区域做出反应和工作。同样在我的情况下,我的系统中没有跨区域链接,所以我要去接下来为MvcSiteMapProvider配置多个站点地图 。

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