基于当前用户的“角色”动态构建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
在母版页中:
<% var model = ViewData["Menu"] as IEnumerable
(注意:实际上,我有一个MasterViewModel,其中包含菜单模型)
你听说过MvcContrib的MenuBuilder吗?
如果没有,我建议你看一下。 示例项目UI
是开始学习如何使用它的好方法。
没有人提到MvcSiteMapProvider这样做,可以使用NuGet轻松集成到您的Visual Studio项目中。
通常我只是以你做过的方式检查角色,然后用链接渲染局部视图或者只是创建它们。 使用Razor语法这样的东西。 我使用T4MVC进行操作。
@if(User.IsInRole("Admin")) { Users }
为了安全起见,我使用了Fluent Security。 希望这可以帮助。
就像@SD“所说,你可以创建一个”shiny的“帮助器,根据你的安全要求,不管是否渲染链接。
这里有一个关于自定义助手的好读物(底部):
在S. Walther的博客上了解-html-helpers
到目前为止,乔的解决方案是最简单的,对我有用。 我的页面存在于不同的区域,我需要快速设置一个菜单系统,根据用户所在的区域做出反应和工作。同样在我的情况下,我的系统中没有跨区域链接,所以我要去接下来为MvcSiteMapProvider配置多个站点地图 。
希望这有助于其他人寻找简单有效的解决方案!