处理ASP中记录/实体级别的安全性.NET MVC应用程序

本文关键字:安全性 NET MVC 应用程序 ASP 记录 实体 处理 | 更新日期: 2023-09-27 18:15:37

每个人都在做什么来处理ASP中单个记录的安全性(检索和修改)?. NET MVC应用程序?这个应用程序有一个服务/业务层和一个数据访问层,它们与Web用户界面完全分离。我已经使用成员资格和角色提供程序来处理应用程序中特定区域/功能的身份验证和授权,但现在我需要保护单个记录。

例如,假设Bob可以创建和编辑他自己的FooBar记录。我想确保其他用户不能查看或编辑Bob的记录。我希望防止URL操作和/或编程错误。我们可能还希望允许Bob与其他用户共享他的foobar,允许他们查看但不能编辑他的记录。

我想到了几种方法:

  • 在数据访问层,直接在检索和修改查询中进行安全检查。
  • 检查服务层的安全性,在继续业务逻辑之前执行额外的安全性查询。
  • 创建存在于UI和服务层之间的安全层。UI将通过安全层发出所有请求。
  • 使用面向方面编程(AOP)。创建安全方面,并用安全属性装饰服务层方法。

我在以前的项目中在数据访问层(在查询中)做过安全,它总是变成一团糟。我想知道其他人都在做什么,以及你正在使用什么框架来帮助你(AOP框架)。

处理ASP中记录/实体级别的安全性.NET MVC应用程序

我总是采用第二和/或第三种方法-在UI和逻辑处理程序之间的某个地方显式安全层。

AOP听起来像是一种完全失去对代码控制的方法,而DAL中的安全性听起来像是一种错误的方法,因为它混合了不同的职责。

我认为到处放逻辑可能是个问题。我也有类似的情况。让我解释一下我是如何处理的。

public class FooBarController : Controller
{
    //this is easy as compared to edit
    [Authorized]
    public ActionResult Create()
    {

    }

    [AjaxAuthorize(Roles = "Administrator")]    
    public ActionResult Edit(int id)
    {

    }
}
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {

        var id = filterContext.RouteData.Values["id"];
        // Here you can check if the id belongs to logged in user
        var content = SomeRepository.GetById(id);
        if (contet.OwnerId=LoggedInUser.Id)
           return;
        //otherwise check if logged in user is from some Admin or other role.

        string redirectPage = "/account/logon";
        var roles = base.Roles.Trim().Split(',');
        bool CanAccess = false;
        //If no role is there
        if (base.Roles.Equals(string.Empty) || roles.Count() == 0)
        {
            CanAccess = true;
        }
        else
        {
            foreach (var item in roles)
            {
                CanAccess = filterContext.HttpContext.User.IsInRole(item);
                if (CanAccess)
                    break;
            }
        }
        var request = filterContext.RequestContext.HttpContext.Request;
        if (request.IsAjaxRequest())
        {
            if (!(request.IsAuthenticated && CanAccess))
            {
                filterContext.Result = new AjaxAwareRedirectResult(redirectPage);
                return;
            }
        }
        base.OnAuthorization(filterContext);
    }
}
public class AjaxAwareRedirectResult : RedirectResult
{
    public AjaxAwareRedirectResult(string url)
        : base(url)
    {
    }
    public override void ExecuteResult(ControllerContext context)
    {
        if (context.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
            JavaScriptResult result = new JavaScriptResult()
            {
                Script = "window.location='" + destinationUrl + "';"
            };
            result.ExecuteResult(context);
        }
        else
            base.ExecuteResult(context);
    }
}

现在您可以允许由所有者或管理员编辑内容。我把这个属性称为Ajax,因为它也会处理AjaxRequest。我希望这对你有帮助。

Parinder

public class Entity
{
     public Right[] Rights { get; set; }         
}
public class Right
{
     public User user {get;set;}
     public Permission[] permissions {get;set;}
}
public class Foo : Entity
{

}
public class Bar : Entity
{
}

在上面的方法中,有一个基类Entity,它存储了特定用户对该实体的权限。从实体类继承您想要保护的所有类