确定用户是否可以基于角色访问给定的Controller Action

jda*_*vis 9 c# asp.net asp.net-membership asp.net-mvc-4

我正在尝试为我建立一个动态菜单ASP.NET MVC4 web application.当我构建菜单时,我想确保用户不应该访问的菜单项不会显示在菜单中.

我正在使用表单身份验证和[Authorize]每个页面需要给定角色的属性.

给定两个字符串(Controller and Action)和一个登录用户,如何确定用户是否可以访问该控制器操作?


我的所有菜单数据都存储在数据库中.我渲染菜单的计划是构造菜单数据的JSON对象并将其嵌入到View中.然后客户端我将使用Handlebars.js菜单JSON object并将其插入模板.


我正在尝试检查用户的给定Controller/Action的权限,因为我正在渲染菜单数据.我最初的想法是使用反射并查找控制器操作方法并检查是否存在Authorize属性,并检查当前登录用户是否具有访问该页面的必要角色.如果不是,则不会呈现菜单项.

我总是不愿意使用reflection,通常往往会有一种更简单的做事方式.

Tig*_*ies -1

您可以使用 Authorize 属性来装饰控制器中的操作[Authorize(AuthorizationContext)],也可以扩展 Authorize 属性以进行自定义授权;

您还可以在字典中定义一些约定,在其中定义控制器的创建操作也需要创建类型授权

Dictionary<string, Right> actionConventions = new Dictionary<string, Right>
    {
        { "Index", Right.View },
        { "List", Right.View },
        { "Open", Right.View },
        { "Create", Right.Create},
        { "Edit", Right.Edit },
        { "Delete", Right.Delete }
}
Run Code Online (Sandbox Code Playgroud)

和 的覆盖OnAuthorizationAuthorize方法AuthorizeAttribute,如果操作遵循字典中定义的约定,则检查约定,或者检查操作Authorize(AuthorizationContext)或 的特定条件HandleUnauthorizedRequest(AuthorizationContext)

处理菜单,您可以创建一个授权服务,在其中返回当前用户的权限并添加一个包含用户权限的类,并且在渲染模型时检查模型是否应该渲染菜单项。

授权属性 MSDN