首页 文章

ASP.NET MVC基于角色的控制器操作权限

提问于
浏览
1

我有一个ASP.NET MVC4 Web应用程序,其中包含表用户,角色和rolePrivileges

userid用户名密码roleid]值:1 user1 12345 3,2 user2 12345 1,3 user3 12345 2

[roleid,rolename]值:1个管理员,2个客户,3个客人,4个...

[Roleid,Action,GrantAccess]值:1 / Home / Index Y 1 / Home / Settings Y 1 / Home / Dashboard Y 2 / Home / Index Y 2 / Home / Settings N 2 / Home / Dashboard Y 3 / Home / Index Y 3 / Home /设置N 3 / Home / Dashboard N.

我想在ASP.NET MVC表单身份验证中实现以下功能:

应动态授予控制器操作拒绝访问角色的权限,如果用户尝试访问未授予用户访问权限的控制器操作,则应注销该应用程序 .

1)我想知道实现这一目标的最佳方法,因为对像Authorize(Roles =“admin”)这样的角色名称进行硬编码将不起作用

2)我还有用户特定的设置需要在用户登录时进行初始化,在asp.net表单中存储在会话变量中可以使用asp.net中的TempData完成相同的MVC这是最佳做法吗?

1 回答

  • 2

    您可以基于角色组而不是角色创建操作过滤器 . 角色组可以以1对多的关系存储在数据库中 . (即1组有很多角色) . 然后将组名称提供给操作过滤器 .

    public class RoleGroupFilterAttribute : ActionFilterAttribute
    {
        public string GroupName { get; set; }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string [] users = new string[] {};
            string [] roles = new string[] {};
    
            // get the roles / users for the group from your db or storage
            // below is an example only
            roles = mydb.RoleGroups.Where(r=>r.Name == GroupName).Select(r=>r.Roles).ToArray();
    
            var user = filterContext.HttpContext.User;
            var userRoles = Roles.GetRolesForUser();
    
            if (!roles.Any(r => userRoles.Contains(r)) && !users.Contains(user.Identity.Name))
            {
                // return a not found result or redirect to an action
                filterContext.Result = new HttpNotFoundResult();
            }
        }
    }
    

    要使用您,只需创建管理页面即可管理您的角色组 . 将过滤器添加到控制器或操作非常简单 .

    [RoleGroupFilter(GroupName="MyGroup")]
    public ActionResult Index()
    {
        return View();
    }
    

    在上面的示例中,我还允许将用户添加到角色组,但这将是您的选择 .

相关问题