在视图或控制器中进行授权更好吗?

时间:2017-04-09 10:39:09

标签: c# asp.net-mvc

(查看)

naiveBayes

(控制器)

//deny access to these Roles Beside Admin(Role3)
if (RoleId == 1 || RoleId == 2 || RoleId == 4)
{
//Redirect to home if RoldId is not 3
    Response.Redirect("~/Home/Index");
}

两者的工作方式相同但哪个更好,为什么?

2 个答案:

答案 0 :(得分:1)

控制器,如果它是一个基于角色的控制器。 虽然如果需要进一步细化分发,视图仍然可以使用某些约定。

例如。接待员和医生都可以访问相同的患者详细信息,但是使用基于视图的授权,您可以精细地分发哪些字段可用于视图或编辑的角色。

答案 1 :(得分:0)

由于您的视图由Razor View Engine呈现为服务器端的HTML代码,因此您可能会发现没有区别。特别是,两种方法之间的主要区别在于,第一种方法在有可能发生错误或抛出异常的情况下不安全,这会导致错误的页面错误和异常处理效率低下。

虽然后一种方法可以被认为是最好的,因为它允许您处理控制器中的所有异常或错误,或者更重要的是,您可以根据用户的角色渲染返回的视图。

例如:

[CustomAuthorize] 
public IActionResult AdminDashboard(){
     if(HttpContext.User.IsInRole("Admin"))
         return View("X");
     else if (HttpContext.User.IsInRole("Guest"))
         return View("Y");
     else 
        return RedirectToAction("Some Action");
        // Or throw an exception 
}

此外,您可以编写异常处理属性来处理在控制器级别或呈现结果时抛出的异常。这可以通过继承Attribute并实现IActionFilterIResultFilter接口来完成。

例如:

public class HandleLoginAttribute : Attribute, IActionFilter, IResultFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.Exception != null) {
            // Handle exceptions thrown by the action api
        }
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {

    }

    public void OnResultExecuted(ResultExecutedContext context)
    {
        if (context.Exception != null)
        {
            // Handle exceptions thrown when rendering the view
        }
    }

    public void OnResultExecuting(ResultExecutingContext context)
    {

    }
}    

所以你可以拥有类似的东西:

[HandleLogin]
[CustomAuthorize] 
public IActionResult AdminDashboard(){
     if(HttpContext.User.IsInRole("Admin"))
         return View("X");
     else if (HttpContext.User.IsInRole("Guest"))
         return View("Y");
     else 
        return RedirectToAction("Some Action");
}

关键优势在于你可以有效地重用所有这些,而你却无法做到(或者你无法有效地做到)内部视图。