允许/拒绝用户根据角色权限调用Controller操作的最佳做​​法

时间:2015-11-03 14:20:13

标签: c# asp.net-mvc

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

用户也可以拥有多个角色但我已经覆盖了这个角色。我面临的唯一问题是:由于角色分配可以在应用程序内动态完成,因此我无法在控制器操作上使用[Authorize(Roles = Role.Admin)]属性。

相反,我正在考虑创建[读取],[写入],[编辑]和[删除]属性,我将放在操作上让我知道该操作的用途,然后允许或拒绝用户调用该操作行动。

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

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

enter image description here

上述方法会有效吗?如何定义控制器操作的自定义访问权限?

我希望避免在数据库中执行所有操作并简化网站上的管理。

通过这种方式,管理可以在控制器级别上的R / W / E / D标志上完成,而不是Role1可以在所有Home / Index,Home / GetRecords等...动作级别。

3 个答案:

答案 0 :(得分:1)

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

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

湾为User创建一个类并从“ActionFilterAttribute”继承该类,并覆盖OnActionExecuting方法。

℃。为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);

        }
    }

答案 1 :(得分:0)

我会以不同的方式定义它,只需为每个用户分配一组角色。

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

现在,当您定义操作时,可以使用此格式<script type="text/javascript"> document.addEventListener("DOMContentLoaded", init, false); function init() { var canvas = document.getElementById("canvas"); canvas.addEventListener("mousedown", getPosition, false); // how can I get the return values here? } function getPosition(event) { var x = new Number(); var y = new Number(); var canvas = document.getElementById("canvas"); if (event.x != undefined && event.y != undefined) { x = event.x; y = event.y; } else { x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; y = event.clientY + document.body.scrollTop + document.documentElement.scrollTop; } x -= canvas.offsetLeft; y -= canvas.offsetTop; alert("x: " + x + " y: " + y); // here can print the correct position // if I add the two values here, and return them. How can I receive the values in funciton init() // var clickPosition={"x":x, "y":y}; // return clickPosition; } </script> 。通过所需的访问权限设置每个操作,您就完成了。

答案 2 :(得分:0)

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

然后让他们的角色由他们可以做的声明/操作列表定义。

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