我正在用C#开发一个小型PoC WebApi,用户应该能够查看或编辑他的全名,例如:
my.api.com/users
将返回所有用户(包含Id
和FullName
属性的JSON对象数组,代表用户)。每个人都可以访问。my.api.com/users/{id}
会返回与id
匹配的单个用户。每个人都可以访问。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进行身份验证?
答案 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]
注释仅将操作限制为允许管理电影的用户。