【问题标题】:Best practice to allow/deny user to call Controller actions depending on role rights根据角色权限允许/拒绝用户调用控制器操作的最佳实践
【发布时间】:2016-02-03 17:49:12
【问题描述】:

我有一个角色系统,管理员可以在其中创建新角色并根据页面菜单授予读取、写入、编辑和删除权限(每个页面菜单都有自己的控制器),然后将该角色分配给用户。

用户也可以有多个角色,但我已经知道了。我面临的唯一问题是:因为角色分配可以在应用程序内动态完成,所以我不能在控制器操作上使用[Authorize(Roles = Role.Admin)] 属性。

相反,我正在考虑创建 [Read]、[Write]、[Edit] 和 [Delete] 属性,我会将这些属性放在操作上,让我知道该操作的用途,然后允许或拒绝用户调用它行动。

这是正确的方法吗?我需要在这些自定义属性中拥有什么,我将如何允许/拒绝用户调用它们?有人有类似经历吗?

假设我有 Home 和 Admin 控制器以及 Role1 和 Role2 具有以下权限:

类似上述方法的方法可行吗?如何为控制器操作定义自定义访问?

我想避免将所有操作都放在数据库中并简化网站的管理。

通过这种方式,可以在控制器级别对 R/W/E/D 标志进行管理,而不是 Role1 可以对所有 Home/Index、Home/GetRecords 等...操作级别进行管理。

【问题讨论】:

  • 是不是说任何有写权限的人也可以读?并且任何拥有编辑权限的人都可以读写?可以删除的人可以做之前的所有动作吗?
  • 只需创建 CRUD 操作并指定哪个角色可以执行哪些操作(按属性)或为每个角色创建视图结构,每个角色配置将有单独的 web.configs。
  • @LiranBo 如果用户有任何其他标志,但 Edit 和 Write 不一样,他们将获得读取权限。写意味着添加新的东西,而编辑意味着......很好地编辑已经存在的东西。

标签: c# asp.net-mvc


【解决方案1】:

我对我的项目有同样的要求。在我的项目中,我必须允许用户访问一些页面和一些页面来管理。大多数管理员可以访问所有内容,但我必须阻止用户访问某些页面/操作。我做了下面的事情。

一个。创建一个类来验证用户/管理员。

b.为 User 创建一个类并从“ActionFilterAttribute”继承该类,并重写 OnActionExecuting 方法。

c。为 Admin 创建一个类,并按照“b”中提到的方式执行相同的操作,但针对 admin。

d。根据访问权限,将 Authentication 类名放在类名或方法之上。

参见示例代码(步骤 b)。我删除了一些代码,但你可以理解。

public class AuthenticateUser : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext context)
        {
            //Do session check.
            if (HttpContext.Current.Session["Id"] == null || String.IsNullOrEmpty(HttpContext.Current.Session["Id"].ToString()))
            {
                HttpContext.Current.Response.StatusCode = HttpStatusCode.Forbidden.GetHashCode();
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.Result = new JsonResult { Data = new { Status = HttpStatusCode.Forbidden, LogonRequired = true, result = "Session Expired" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
                }
                else
                {
                    //redirect to login page
                    UrlHelper oUrl = new UrlHelper(HttpContext.Current.Request.RequestContext);
                    string s = oUrl.Action("", "UserInfo/");
                    HttpContext.Current.Response.Redirect(s);
                }
            }

            //If usertype is User then allow it. If user type is admin then return redirect.

            //Redirect code if admin
            UrlHelper oUrl = new UrlHelper(HttpContext.Current.Request.RequestContext);
            string s = oUrl.Action("", "UserInfo/");
            HttpContext.Current.Response.Redirect(s);

        }
    }

【讨论】:

    【解决方案2】:

    我会以不同的方式定义它,只是给每个用户一组角色。

    为每个用户定义多个角色,如果有人有权写,你设置一个角色让他写,如果他也能读你可以添加另一个角色 - 读。

    现在,当您定义您的操作时,您可以使用此格式[Authorize(Roles = Role.Read)]。通过所需的访问权限设置每个操作,您就完成了。

    【讨论】:

      【解决方案3】:

      使用声明。您需要定义的每个公共控制器操作声明。

      然后通过他们可以执行的声明/操作列表定义您的角色。

      这里有一个很好的解释Role-based access control (RBAC) vs. Claims-based access control (CBAC) in ASP.NET MVC

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-11
        • 2017-06-11
        • 2010-09-21
        • 2017-02-04
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多