ASP.NET MVC服务层复杂授权

时间:2015-07-18 11:38:12

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

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

我有一个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;

    ....
}

这是正确的方法还是有另一种模式?

1 个答案:

答案 0 :(得分:0)

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

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)
{
  // ....
}