【问题标题】:Limiting data modification by User ASP.NET MVC4通过用户 ASP.NET MVC4 限制数据修改
【发布时间】:2014-10-19 01:34:16
【问题描述】:

我正在使用 ASP.NET MVC4 构建一个应用程序作为学习练习。我试图理解 身份验证和授权。这似乎很好,基于角色的授权似乎可以将某些控制器/操作限制为属于给定角色的用户。

我正在努力解决的是如何将其应用于属于个人用户的数据。以论坛为例,如何实现这样的功能,即用户只能编辑或删除他们创建的帖子,但可以查看/添加 cmets 到其他用户的帖子。这是否必须在代码中通过在允许更新发生之前检查与要针对当前用户更新的帖子关联的用户来完成,如果它们不匹配则返回未经授权的用户。

有没有比将这种逻辑应用于多个控制器/动作的更优雅的解决方案?

那里有大量信息,我只是想缩小搜索范围。任何人都可以提出一个很好的教程/文章。我一直在研究表单身份验证和成员资格,但我也对使用身份的东西感兴趣。我也在使用实体框架。

谢谢

【问题讨论】:

    标签: asp.net entity-framework asp.net-mvc-4 authentication authorization


    【解决方案1】:

    这是否必须在代码中通过在允许更新发生之前检查与要更新的帖子关联的用户来针对当前用户进行,如果不匹配则返回未经授权的用户。

    是的,这正是你所做的。虽然基于角色的授权只是用户和角色之间的简单关系,但数据访问级别的授权通常很复杂,并且涉及自定义业务规则。

    当然,创建一个薄层管理器会很有帮助,这些管理器通常用作守卫,这样您就可以将所有代码紧密地放在一起:

     [HttpPost]
     public ActionResult PostFoo( FooModel model )
     {
         // keep the access manager separate from the
         // domain layer. operate on IDs.
         if ( new UserAccessManager( this.User ).
            CanOperateOnFoo( model.IdSomething, model.IdWhateverElse ) )
         {
         }
         else
            // return 403 or a meaningful message  
     }
    

     [HttpPost]
     public ActionResult PostFoo( FooModel model )
     {          
         // switch to the domain layer
         Foo foo = Mapper.Map( model );
    
         // make the access manager part of the domain layer
         if ( foo.CanBeOperatedBy( this.User ) )
         {
         }
         else
            // return 403 or a meaningful message  
     }
    

    【讨论】:

    • 非常感谢您的回复和建议。我喜欢让访问管理器成为域层的一部分的想法。这样,如果业务规则发生变化,例如,用户可以允许一组其他用户访问以更改控制器甚至不必知道的特定数据项,他们只需每次调用​​相同的方法来首先检查然后执行更新
    【解决方案2】:

    这是否必须在代码中通过在允许更新发生之前检查与要更新的帖子关联的用户来针对当前用户进行,如果不匹配则返回未经授权的用户。

    不,您希望避免将授权逻辑硬编码到您的代码中。这样做会导致:

    • 授权孤岛
    • 能见度差
    • 授权逻辑中可能存在错误
    • 难以维护的逻辑

    有没有比将这种逻辑应用于多个控制器/动作的更优雅的解决方案?

    是的,有。就像您不会硬编码身份验证或登录到您的应用程序一样,您希望将授权外部化。这称为外部授权管理 (EAM)。从 Java 中的 Spring Security 到 .NET 中基于声明的授权,再到基于 XACML 的解决方案,有几个框架可以帮助您做到这一点。

    您需要考虑两种基本授权模型:

    • 基于角色的访问控制 (RBAC)
    • 基于属性的访问控制 (ABAC)

    您可以在 NIST 的网站 (RBAC | ABAC) 上阅读这两个方面的信息。

    鉴于您提供的示例规则:

    用户只能编辑或删除他们创建的帖子,但可以查看/添加 cmets 到其他用户的帖子。

    RBAC 是不够的。您将需要使用 ABAC(和 XACML)来实现用户和请求的数据之间的关系。 XACML,eXtensible Access Control Markup Language 是一个为您提供的标准:

    • 标准架构。
    • 请求/响应方案,以及
    • 一种策略语言。

    使用 XACML 策略语言,您可以将示例重写为:

    • 当且仅当 post.owner==user.id 时,用户才能执行 action==edit 或 action==remove
    • 用户可以对任何帖子执行操作==查看
    • 用户可以对任何帖子执行操作==评论

    然后,通过您的代码,您所要做的就是发送授权请求:Alice 可以查看帖子 #123 吗?。授权引擎(也称为策略决策点或 PDP)将确定谁拥有该帖子并将做出决定,DenyPermit

    使用外部授权和 XACML 的一个主要好处是,您可以将相同的一致授权应用于任何层(表示层、业务层、ESB、API、数据库...)和任何技术(Java、.NET、Python ...)。

    其他好处包括:

    • 模块化架构
    • 配置驱动的授权可以随着需求的变化而轻松扩展
    • 易于审核的授权
    • 集中管理的授权
    • 开发和载入新应用程序比一遍又一遍地编写代码更便宜
    • 基于标准。

    有几种开源和供应商解决方案可以解决这个市场。看看Axiomatics(免责声明:我为 Axiomatics 工作)或 SunXACML(开源)。

    HTH, 大卫。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2016-05-26
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多