【问题标题】:ASP.NET MVC service layer complex authorizationASP.NET MVC 服务层复杂授权
【发布时间】:2015-07-18 11:38:12
【问题描述】:

我有一个关于在服务层中进行任何数据库更新之前授权/验证用户操作的问题。

我有一个 JobPostingController,它提供了创建/更新/删除职位发布的方法。

我希望用户只有在他是实体的所有者时才能更新/删除职位发布。 (在我的 JobPosting 实体中有类似 JobPostingOwner 的东西)

有没有一种简单的方法来创建自定义控制器操作过滤器来实现这一点?

据我了解,检查是否允许用户更新/删除特定实体应该在服务层中,但不知道是否有比这更简单的方法

public void UpdateJobPosting(JobPosting jobPosting, User user)
{
    if(jobPostingOwnerId == user.Id) --> OK
    else --> not OK
}

另一个简单的例子:

/JobPosting/Edit/(id)

我想始终检查是否真的允许用户编辑此职位发布。 所以在服务层我会这样做:

public JobPosting GetJobPosting(int id, User user)
{
    var query = from item in context.JobPostings
                where item.id == id
                && item.OwnerId == user.Id
                select item;

    ....
}

这是正确的方法还是有其他模式?

【问题讨论】:

    标签: asp.net asp.net-mvc validation security authorization


    【解决方案1】:

    首先,您需要在服务层中使用这样的方法:

    public bool IsUserAllowed(int potingId, User user)
    {
                var query = from item in context.JobPostings
                            where item.id == potingId
                            && item.OwnerId == user.Id
                            select item;
                var result = query.FirstOrDefault();
                return result != null;
    }
    

    然后创建一个自定义操作过滤器(一个名为CustomActionFilterAttribute 的类派生自AuthorizeAttribute),在AuthorizeCore 方法中,您可以简单地检查用户的权限:

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
                base.AuthorizeCore(httpContext);
                var routeData = httpContext.Request.RequestContext.RouteData;
                var jobPostingId = (routeData.Values["id"] as string) ?? (httpContext.Request["id"] as string);
                var user = UserManager.FindUser(httpContext.User.Identity.GetUserId<int>());
                return _jobPosting.IsUserAllowed(int.Parse(jobPostingId), user);
    }
    

    最后,您必须使用自定义操作过滤器来装饰您的 Edit 操作方法:

    [CustomActionFilter]
    [HttpPost]
    public ActionResult Edit(int id)
    {
      // ....
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2011-07-07
      • 2013-10-09
      • 2017-01-02
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2017-01-07
      • 2016-09-27
      相关资源
      最近更新 更多