1

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

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

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

4

2 回答 2

2

请查看AuthorizeAttribute和特定的角色

用法 :

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

 // your code
}

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

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

 // your code
}

whereUsersHelper.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();
        }
    }
}

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

于 2013-09-25T08:56:58.880 回答
0

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

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

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

于 2013-09-26T05:44:08.653 回答