验证操作过滤器或授权过滤器的用户权限?

时间:2014-02-22 18:09:37

标签: jquery asp.net-mvc asp.net-mvc-4 asp.net-mvc-5 toastr

我正在开发一个MVC4网站。我开发了用户角色和权限。

我想问一下我应该在哪里检查用户权限访问:在自定义操作过滤器中,还是自定义授权过滤器?

如果用户无权访问该模块,则必须显示烤面包机错误消息。如何在动作过滤器中显示此消息?

2 个答案:

答案 0 :(得分:2)

我用来编写自定义操作过滤器属性,以便在操作调用中调用此方法,如果用户角色允许他调用此操作,我会检入它。

您必须以相同的方式编写自定义操作过滤器属性,但您必须在CheckAccessRight方法中编写自己的业务逻辑:

public class AuthorizationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string actionName = filterContext.ActionDescriptor.ActionName;
        string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;



        if (!CheckAccessRight(actionName, controllerName))
        {
            string redirectUrl = string.Format("?returnUrl={0}", filterContext.HttpContext.Request.Url.PathAndQuery);

            filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + redirectUrl, true);
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
    }


    private bool CheckAccessRight(string Action, string Controller)
    {
        if (HttpContext.Current.Session["userId"] != null)
        {
            string userID = HttpContext.Current.Session["userId"].ToString();
            using (var db = new cloud_clinicEntities())
            {
                assignment objAss = null;
                if (HttpContext.Current.Session["AccountType"].ToString() == "lab")
                {
                    objAss = db.assignments.SingleOrDefault(model => model.userid == userID);
                }
                else
                {
                    objAss = db.assignments.SingleOrDefault(model => model.employeeId == userID);
                }

                String UserRole = objAss.itemname;

                itemchildren objChild = db.itemchildrens.SingleOrDefault(model => model.parent == UserRole && model.child == Controller + " " + Action);

                if (objChild != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }


            }
        }
        else
        {
            return false;
        }
    }
}

然后在这样的操作中使用此属性:

[AuthorizationAttribute]
        public ActionResult MyAction()
        {
        }

答案 1 :(得分:0)

Here's一篇好文章。您可以为管理员等几个角色设置自己的属性。