【问题标题】:ASP.NET MVC2 Access-Control: How to do authorization dynamically?ASP.NET MVC2 访问控制:如何动态进行授权?
【发布时间】:2010-06-02 13:54:48
【问题描述】:

我们目前正在重写我们组织的 ASP.NET MVC 应用程序,该应用程序已经编写了两次。 (一次 MVC1,一次 MVC2)。 (谢天谢地,当时还没有准备好生产并且太成熟了)。

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

到目前为止,我们一直在使用 AuthorizeAttribute 的 Controller 和 Action 授权。

但这不会再这样做了,因为我们的视图应该根据登录的用户显示不同的结果。

用例:假设您是一个城市的专业人士,并且您登录到联邦管理的软件,并且您只能访问和编辑您所在城市的公民。

您可以通过包含MajorIdCityId 的专用MajorHasRightsForCity 表中的条目访问这些公民。

我想到的是这样的:

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 会进行各种检查并从它的方法中返回真或假。

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

allowed 也在做类似的事情吗?

【问题讨论】:

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


    【解决方案1】:

    对于一个体面的应用程序,这几乎就是我所做的。

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

    从概念上讲,这(Controller)是确定View 返回什么的逻辑所在。它可以阻止业务逻辑渗入View

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果您从 Codeplex 获得 MVC 的源代码,您可以看到 Authorize 属性是如何完成的并对其进行修改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 2020-09-12
        相关资源
        最近更新 更多