ASP.NET MVC2 Access-Control:如何动态进行授权?

时间:2010-06-02 13:54:49

标签: c# asp.net asp.net-mvc-2 authorization scalability

我们目前正在重写已经编写过两次的组织ASP.NET MVC应用程序。 (曾经是MVC1,曾经是MVC2)。 (感谢上帝,那时生产准备就绪并且太成熟了。)

这一次,无论如何,这将是真正的交易,因为我们将随着时间的推移实现越来越多的功能,MVC1和MVC2的测试表明我们已经准备好升级

到目前为止,我们正在使用AuthorizeAttribute的控制器和操作授权。

但是这不会再这样了,因为我们的观点应根据登录用户显示不同的结果。

  

使用案例:假设您是某个城市的专家,并且您登录的是联邦托管软件,您只能访问和编辑您所在城市的公民。

允许您通过包含MajorHasRightsForCityMajorId的专门CityId表格中的条目访问这些公民。

我想到的是这样的:

Public ViewResult Edit(int cityId) {
    if(Access.UserCanEditCity(currentUser, cityId) {
        var currentCity = Db.Cities.Single(c => c.id == cityId);
        Return View(currentCity);
    } else {
        TempData["ErrorMessage"] = "Yo are not awesome enough to edit that shizzle!"
        Return View();
    }

静态类Access将执行各种检查,并从其方法返回true或false。

这意味着每次更改内容时我都需要更改和编辑所有控制器。 (这将是一种痛苦,因为每次发生变化时都需要调整所有单元测试。)

甚至做过类似的事情allowed

2 个答案:

答案 0 :(得分:2)

这就是我为一个体面的应用程序做的事情。

如果用户没有任何访问权限,我会返回一般错误视图return View("Error");,因此您不需要在每个View上处理错误消息。

从概念上讲,这(Controller)是决定返回View的逻辑所在的位置。它会阻止业务逻辑流入View

您可以将页面中某些与角色相关的部分抽象为部分视图,以避免混乱:

 <% if (User.IsInRole("Admin")) { %>
      Html.RenderPartial("AdminPanel");
 <% } %>

答案 1 :(得分:2)

您是否考虑过编写自己的动作过滤器属性?

这样你就可以用属性装饰你的控制器并节省大量的复制和粘贴,如果它需要更改,那么它只能在一个地方完成。

如果从Codeplex获取MVC的源代码,您可以看到Authorize属性是如何完成的并修改它。