将WebApi端点限制为用户

时间:2018-01-27 18:27:36

标签: c# asp.net asp.net-web-api

我正在用C#开发一个小型PoC WebApi,用户应该能够查看或编辑他的全名,例如:

  • GET my.api.com/users将返回所有用户(包含IdFullName属性的JSON对象数组,代表用户)。每个人都可以访问。
  • GET my.api.com/users/{id}会返回与id匹配的单个用户。每个人都可以访问。
  • PUT my.api.com/users/{id}用于修改与FullName匹配的用户的id属性。这应该只能按用户访问。

我想让我的PUT请求需要身份验证,并且每个用户只能编辑自己的FullName(例如ID为0的用户应该无法进行身份验证PUT请求my.api.com/users/1

来自ASP.NET MVC世界,我对如何处理这个问题感到有些困惑。在MVC中,我只是将操作标记为[Authorize],并确保进行调用的用户的ID与该特定操作中传递的实际ID相匹配。

我已经了解授权如何在使用this Microsoft resource的WebApi中工作(例如使用承载令牌等)。这是否意味着用户注册与ASP.NET MVC非常相似,即使用用户名/密码注册,然后使用承载令牌对WebApi进行身份验证?

1 个答案:

答案 0 :(得分:0)

您可以在WebApi Actions上使用[Authorize],就像在MVC中使用它一样。这是我旧代码的片段:

public class MoviesController : ApiController
{
    // POST /api/movies/
    [Authorize(Roles = RoleName.CanManageMovies)]
    [HttpPost]
    public IHttpActionResult CreateMovie(MovieDto movieDto)
    {
        if (!ModelState.IsValid)
            return BadRequest();

        var movie = Mapper.Map<MovieDto, Movie>(movieDto);
        _context.Movies.Add(movie);
        _context.SaveChanges();

        return Created(new Uri($"{Request.RequestUri}/{movie.Id}"), movie);
        }

    // PUT /api/movies/1
    [Authorize(Roles = RoleName.CanManageMovies)]
    [HttpPut]
    public IHttpActionResult UpdateMovie(int id, MovieDto movieDto)
    {
        if (!ModelState.IsValid)
            return BadRequest();

        var movieInDb = _context.Movies.SingleOrDefault(m => m.Id == id);

        if (movieInDb == null)
            return NotFound();

        Mapper.Map(movieDto, movieInDb);

        _context.SaveChanges();

        return Ok();

    }

    // DELETE /api/movies/1
    [Authorize(Roles = RoleName.CanManageMovies)]
    [HttpDelete]
    public IHttpActionResult DeleteMovie(int id)
    {
        var movieInDb = _context.Movies.SingleOrDefault(m => m.Id == id);

        if (movieInDb == null)
                return NotFound();

        _context.Movies.Remove(movieInDb);
        _context.SaveChanges();

        return Ok();
    }
}

正如您所看到的,我使用[Authorize]注释仅将操作限制为允许管理电影的用户。