【问题标题】:Entity based security in asp.net MVC4asp.net MVC4中基于实体的安全性
【发布时间】:2013-09-25 08:49:19
【问题描述】:

我一直在寻找一些解决方案来根据实体设置安全性。就像用户只能访问它有权访问的实体一样。

我可以集中控制而不是检查每个动作方法。我在这里也谈论使用 ajax 调用的访问实体。例如,用户打开了一个 orderId 10 ,我有一个隐藏字段,如果他通过任何方式将 orderId 的值更改为 11 他可以访问或修改 orderId 11 的订单,而他只能看到 orderId 10 。

有时我们只发送一些值以及主要实体 ID,例如 getOrderByUserId(int userId),因为此操作方法在 OrderController 中基于 userId 访问订单。

【问题讨论】:

  • 这里的实际问题是什么?

标签: asp.net-mvc entity-framework security asp.net-mvc-4


【解决方案1】:

请看AuthorizeAttribute的具体角色

用法:

[Authorize(Roles = "manager,admin")]
public ActionResult myMethod(){

 // your code
}

您可以使用Users 属性并执行以下操作:

[Authorize(Users = UsersHelper.GetAllowedUsers)]
public ActionResult myMethod(){

 // your code
}

其中UsersHelper.GetAllowedUsers 是一个带有静态方法的静态类,它以如下格式返回用户:"joe1,admin,momandpop"

更新 OP 评论:

/// <summary>
/// Checks if the current user is the owner of the Order
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class IsOwnerOfOrderAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (!(filterContext.Result is HttpUnauthorizedResult))
        {
           // code to check if user has the order he is trying to edit
           // if not return this
           filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

您可以将它放在控制器或特定操作的顶部。

【讨论】:

  • GetAllowedUsers,不错的 +1
  • 但我期待一个更通用的解决方案,即某些东西可以获取用户 ID,因为它知道它是基于 (user)(Id) 和身份验证的用户。更好的例子是 getOrderByProductId(int productId )。当我们基于产品显示一些订单时就是这种情况,但我想限制用户,这样如果用户更改包含 orderId 的视图的隐藏字段,它就无法更改订单实体。对每个操作方法进行授权是使用 fluentSecurity 没有吸引力。
  • 那么您需要为每个用户保留每个订单的列表,如果用户没有该订单 ID,他将被拒绝访问。跟随样本
  • 感谢等待样品
  • 它在“更新到 OP 评论”下
【解决方案2】:

您说的不是基于实体的安全性,而是 mssql 提供的逐行安全性。 基于实体的安全性是如果允许用户编辑,他将能够编辑任何其他 id。

为此,您必须维护用户角色的层次结构,然后存储可以对表中的每一行执行编辑或任何操作的最小角色。

或者如果您想阻止用户使用查询参数,您可以使用参数或会话或TempData在动作之间传输数据以传输id和工作。

【讨论】:

  • 我有点不清楚你在这里的建议。我有一个简单的要求,即任何用户都不能更改他不允许更改的实体的数据,它可以基于自定义规则,例如他拥有什么权限。我不想检查每个操作方法。
  • 要只编写一次验证代码,创建一个 BaseController,它将检查函数中所需的验证为 `protected override void OnActionExecuting(ActionExecutingContext filterContext) {'并且需要验证的控制器将扩展这个基础控制器。
  • 这将检查扩展它的控制器的每个操作执行事件,但根据您的问题,您需要对表中的每一行数据进行检查。
猜你喜欢
  • 2010-09-18
  • 2012-03-18
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多