Asp.net mvc asp.net MVC4中基于实体的安全性

Asp.net mvc asp.net MVC4中基于实体的安全性,asp.net-mvc,entity-framework,security,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Security,Asp.net Mvc 4,我一直在寻找一些解决方案,将安全性建立在实体的基础上。就像用户只能访问其有权访问的实体一样 我可以集中控制,而不是检查每一个动作方法。我在这里还讨论了使用ajax调用访问实体。例如,一个用户打开了一个orderId 10,因为我有一个隐藏字段,如果他通过任何方式将orderId的值更改为11,他可以访问或修改orderId为11的订单,而只允许他查看orderId 10 有时我们只发送一些值和主实体id,例如getOrderByUserId(int userId),因为此操作方法位于OrderC

我一直在寻找一些解决方案,将安全性建立在实体的基础上。就像用户只能访问其有权访问的实体一样

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

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

请查看和查看特定实体中的角色

用法:

[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();
        }
    }
}
//
///检查当前用户是否是订单的所有者
/// 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple=false,Inherited=true)]
公共类IsOwnerOfOrderAttribute:AuthorizeAttribute
{
授权时的公共覆盖无效(AuthorizationContext filterContext)
{
基于授权(filterContext);
如果(!(filterContext.Result为HttpUnauthorizedResult))
{
//用于检查用户是否拥有要编辑的订单的代码
//如果没有,请返回此文件
filterContext.Result=新的HttpUnauthorizedResult();
}
}
}

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

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

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


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

这里的实际问题是什么?GetAllowedUsers,nice+1但我期待一个更通用的解决方案,即一些东西可以获取用户id,因为它知道它是基于(用户)(id)的用户更好的例子是getOrderByProductId(int-productId)。当我们在产品上显示一些订单时就是这种情况,但我想限制用户,这样,如果用户更改了我视图中包含orderId的隐藏字段,它就不能更改订单实体。对每个操作方法进行授权是没有吸引力的。使用fluentSecurity怎么样?然后,您需要为每个订单保留一个列表每个用户,如果用户没有该订单ID,他将被拒绝访问。下面的样本谢谢等待样本在“udpate to OP comment”下面我有点不清楚你在这里的建议。我有一个简单的要求,即任何用户都不能更改不允许他更改的实体的数据,这可以基于自定义规则,例如他拥有的权限。我不想对每个操作方法都进行检查。若要只对每个操作方法编写一次验证代码,请创建一个BaseController,该控制器将检查函数中所需的验证,并将其作为“受保护的覆盖无效OnActionExecuting(ActionExecutingContext filterContext)”{'需要验证此操作的控制器将扩展此基本控制器。这将检查扩展它的控制器的每个操作执行事件,但根据您的问题,您需要对表中的每一行…数据执行检查。