实现逻辑以提供基于角色的viewdata

时间:2013-04-04 21:11:53

标签: c# asp.net-mvc

过去几天我一直在考虑这个问题,并且想知道其他人对此采取的措施。我想实现一些基于用户所属角色的内容。我们的应用程序使用HTTP标头来接收角色信息。在MVC中我应该让控制器处理角色检测,然后将一个布尔值传递给viewmodel。

视图模型:

public class ProductViewModel
{
    public Product MyProduct { get; set; }
    public bool IsAdmin { get; set; }
    public bool IsSuperAdmin { get; set; }
}

控制器:

public class ProductController : Controller
{
    public ActionResult Info()
    {
        //get product information here

        ProductViewModel pvm = new pvm();
        pvm.Product = theProduct;
        pvm.IsAdmin = checkAdminAccess(); //This would return a bool if they had access
        pvm.IsSuperAdmin = checkSuperAdminAccess();//This would return a bool if they had access

        return View(pvm);
    }
}

查看:

@if(Model.IsAdmin == true || Model.IsSuperAdmin == true)
{
    //Render Content for admin (Either directly or via Partial View)
}
@if(Model.IsSuperAdmin == true)
{
    //Render Superadmin content (Either directly or via Partial View)
}
//Implement other Product Stuff Here

或者创建局部视图并处理视图中的逻辑会更好。这似乎涉及的工作较少。

@if (Request.Headers.AllKeys.Contains("role")){
    ViewBag.Role = Request.Headers["role"].ToString();
}
...
@if(ViewBag.Role == "Admin" || ViewBag.Role == "SuperAdmin")
{
    @Html.Partial("AdminPartial")//Or Render Code Directly?
    if(ViewBag.Role == "SuperAdmin")
    {
        @Html.Partial("SuperAdminPartial")//Or Render Code Directly?
    }
}
//Implement other Product Stuff Here

如果我直接渲染内容或使用局部视图或者无关紧要,以这种或那种方式进行操作是否还有其他好处?或者我错过了其他一些应该做的事情?

1 个答案:

答案 0 :(得分:0)

您可以使用AuthorizeAttribute来限制对控制器操作的访问/使用:

[Authorize(Roles = "Admin, Customer")]
public class ProductController : Controller
{
    public ActionResult Info()
    {
        //get product information here

        ProductViewModel pvm = new pvm();

        return View(pvm);
    }

[Authorize(Roles = "Admin")]
public ActionResult EditInfo()
    {
        //get product information here

        EditProductViewModel epvm = new epvm();

        return View(epvm);
    }
}

这是限制调用者访问操作方法的最基本方法。但是,对于具有许多角色/控制器/操作的大型应用程序,注释和跟踪所有属性可能会变得困难。

有一种名为Fluent Security的产品允许在中心位置指定安全性,并摆脱前面提到的问题。

还存在单一责任原则的问题,请看Darin's answer这个问题 - 他解释得很清楚。