【问题标题】:How to create pages with different permissions' views如何创建具有不同权限视图的页面
【发布时间】:2011-07-08 05:43:58
【问题描述】:

我需要为不同类型的用户创建不同的页面视图。 我已经在这里问过了:How to create pages with different permissions' views

尽管 Aldeel 的答案有效,但对我来说似乎不是最佳解决方案。我会解释原因。

我将尝试非常详细地解释我需要什么,希望你们中的一些人能够帮助我:D

我需要展示不同的观点,但不仅如此。每个用户都可以访问页面的不同部分。

我举个例子:

想象一个具有这种结构的页面“X”

Field A
Field B
Field C
Field D

当用户 U1 来自组 G1 访问页面 X 时,系统会在页面 X 上检查该组的权限数据库。用户U1 可以看到Field AField B,但只能编辑Field A

用户U2 设置为无组访问页面X。系统在页面X 上检查他的权限。用户U2 可以查看和编辑所有字段。

当用户U3 来自组G2 访问页面X 时,系统会检查数据库以获取该组在页面X 上的权限。用户U3 可以看到Field CField D,但不能编辑任何内容。

希望通俗易懂……

我找不到一种方法来做到这一点,而不是用大量有关该特定用户权限的数据填充 ViewData。在我的示例中只有 4 个字段,但在我当前的项目中,我没有少于 20 个字段的屏幕。所以我想你可以看到这是多么的丑陋和低效。

正如我所说 (facebook example),这个想法类似于社交网络。当访问 UserX 页面的用户只能看到 UserX 允许他看到的内容时。

非常感谢任何帮助。

最好的问候。

【问题讨论】:

    标签: c# asp.net asp.net-mvc-2 modeling


    【解决方案1】:

    要做你想做的事,你不应该控制你的视图——你实际上必须保护你的控制器——而不是视图。您可以通过控制器属性执行此操作。类似的东西:

    [Authorize]
    public class MyController {
    }
    

    通过这样做,您可以保护整个控制器。如果用户未通过身份验证,则该控制器中的每个操作都不会响应(具体来说,他们将收到 401 响应)。您可以通过授权单个用户或单个角色来扩展此功能,如下例所示:

    [Authorize(Users="eestein,JasCav")
    public class MyController {
    }
    
    [Authorize(Roles="Administrator")]
    public class MyController {
    }
    

    在您的情况下,您可能不希望整个控制器都获得授权。好吧,非常出色的是,ASP.NET MVC 提供了对身份验证的操作级控制。所以,你可以这样做:

    public class MyController {
    
        public ActionResult Index() { }
    
        [Authorize(Roles="Administrator")]
        public ActionResult Admin() { }
    
    }
    

    利用这个想法,您可以控制用户在页面上看到的内容。您将希望从您的操作中返回部分页面,以便您可以加载页面的各个方面。例如,您可能有一个显示一些普通数据和一些秘密数据的视图。普通数据可以通过普通页面返回。秘密数据应作为页面内的部分视图返回。但是,如果发生 401,您可以处理它并且不显示任何内容。

    这很简单。 .NET 团队在设置这方面做得很好,您不必单独检查控制器中的权限。我希望这有助于您入门。在线搜索有关如何使用 Authorization 属性的更多信息。

    更新 如果您拥有控制这些权限的页面管理员,则您必须对如何设置 Authorize 属性保持清醒。这是“角色”非常重要的地方(根据我上面的示例)。例如,如果管理员说“我要将 John Doe 添加到 SpecialUser 角色”,那么 John Doe 用户将能够访问角色设置为 SpecialUser 的所有操作(如果确实如此您系统上的一个角色)。

    显然,您将不得不为管理员提供一些能够做到这一点的方法,而 Authorize 属性完美地做到了这一点。要查看谁对页面具有权限,您必须查询数据库以找出谁是哪个角色的一部分。这是考虑设置的一种方式:

    • 您可以控制动作的角色。
    • 您的管理员可以控制谁被授予这些角色。
    • 您可以随时检查(通过简单的查询)来查看谁被分配到了哪个角色。然后,您可以(通过您对操作角色的了解)查看谁可以查看网站的哪个部分。

    我希望这可以澄清(我希望我能很好地理解您的问题)。我认为您尝试做的事情是可能的。

    更新 2 是的,这确实假设您的控制器上有静态组,并且必须以编程方式添加任何新组。我很想知道什么样的用例需要动态创建不同的权限类型——这似乎很容易被滥用。无论如何,我对此没有解决方案。

    至于局部视图的工作原理……是这样的……

    public class ProductController : Controller
    {
        //
        // GET: /Index/
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Partial1()
        {
           return PartialView();
        }
    
        [Authorize]
        public ActionResult Partial2()
        {
           return PartialView();
        }
    }
    

    在您的 Index.aspx 文件中,您将拥有如下内容:

    <%= Html.RenderAction("Partial1") %>
    <%= Html.RenderAction("Partial2") %>
    

    如果用户未经授权,您可以处理第二个RenderAction,因此视图甚至不会显示。 (您可以在控制器中检查。)

    希望能澄清事情!我正在逃跑,所以我现在无法进一步扩展它。

    【讨论】:

    • @JasCav 谢谢你的回答。我已经在使用 [Authorize] 属性。不是你具体说的。我使用它只是为了防止未经授权的访问。但是还有另一个问题,除非我不能完全理解它是如何工作的。权限将由该特定页面的管理员设置(这就是我使用 facebook 示例的原因)。我无法查看他希望其他人看到的内容,而不是检查数据库。如何返回特定的局部视图?用户可以对字段 a 和 b,或只有 c,或任何内容具有权限。您的解决方案适用于这种情况吗?再次感谢。
    • @eestein - 如果设置正确,我的解决方案可能适用于您描述的情况。我现在正在更新我的答案 - 稍后再查找。
    • @JasCav 我理解,但这假设我只有某些类型的组(我必须将它们静态添加到控制器中),对吧?在我的情况下,adms 将能够随意添加新组。我还不清楚的另一件事是我将如何处理部分视图。两个用户可以看到相同的页面,但具有不同的访问权限。我是否必须为它们中的每一个返回一个局部视图?您能否发布一个小sn-p来展示这是如何完成的?感谢您的耐心等待。
    • @eestein - 另一个更新。看看这是否为您澄清了事情。
    • @JasCav 好的。我实际上确实需要即时添加组。但无论如何,你的方法帮助我思考“开箱即用”。我有一些想法我会尝试。谢谢你的时间。最好的问候。
    【解决方案2】:

    我会推荐“附加”安全性;一个用户的权限,以及他的任何组的权限,加在一起给出了一系列他被允许做的事情。如果他没有明确的许可去做需要许可的事情,他就不能做。在您的情况下,在用户 U1 和组 G1 之间,为用户授予了足够的权限来查看字段 A 和字段 B,以及编辑字段 A。因为用户,无论是他们自己还是通过他们的组,都没有被明确授予权限编辑字段 B 或查看或编辑字段 C 和 D,他没有这些权限。

    我将通过在代码隐藏中放置一个方法来实现这种类型的权限,该方法将接受代表用户及其权限的对象,并将询问这些权限以确定字段的可见性。所有字段一开始都应该是不可见的,这种方法将使它们可见和/或可编辑。

    注意事项:

    • 确保您使用 .NET 服务器端工具来显示/隐藏字段。如果在服务器端将字段的 Visible 属性设置为 false,则呈现的页面甚至不会在 HTML 中包含该字段。相比之下,添加样式或使用 JavaScript 隐藏属性会将它们保留在 DOM 和 HTML 中,因此人们可以“查看源代码”以查看以这种方式隐藏的字段。
    • 切勿使用客户端代码来实现安全性。 JavaScript、ActiveX 控件等可以被拒绝、禁用和/或操纵。显示数据的客户端代码还要求数据位于页面源中的某个位置,这意味着通过查看页面源可以很容易地找到它。
    • 出于同样的原因,不要相信不可编辑的字段不会更改其数据。 HTML 和客户端代码可以使用 FireBug 等工具轻松更改。
    • 如果您从所有不可见/禁用的内容开始并使其可见/启用,那么您的代码将比从开放访问开始并隐藏内容更安全。如果您忘记隐藏新内容,客户会突然看到一个他们不应该触及的新领域。如果您忘记添加代码以根据权限显示新字段,您仍然需要修复它,但要利用不存在的字段会更加困难或不可能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2013-04-29
      相关资源
      最近更新 更多