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

时间:2013-07-01 02:56:04

标签: asp.net asp.net-mvc asp.net-mvc-4

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

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

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

[Roleid,Action,GrantAccess]值: 1 /主页/索引Y. 1 /主页/设置Y. 1 / Home / Dashboard Y. 2 /主页/索引Y. 2 /主页/设置N. 2 /主页/仪表板Y. 3 /主页/索引Y. 3 /主页/设置N. 3 / Home / Dashboard N

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

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

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

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

1 个答案:

答案 0 :(得分: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();
}

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