我在 C# 中遇到控制器授权问题。我在控制器中使用带有令牌和基于角色的授权的 JWT 身份验证。
让我们检查一下这个端点。
[HttpDelete("{userId}/post/{postId}")]
[Authorize(Roles = "User")]
public async Task<IActionResult> DeleteUserPost(int userId, int postId, CancellationToken ct)
{
_mediator.Send(new DeletePostCommand(userId, postId), ct);
return Ok("Post deleted.");
}
这是否意味着每个拥有“用户”角色的人都可以删除其他人的帖子?
例如,Id = 1且role =“User”的授权用户可以通过传递诸如userId = 5和postId = 20(这是另一个用户的值)之类的值来调用此端点。这将导致其他人删除某人的帖子。
从 HttpContext 获取授权用户 Id 并将端点更改为这样的内容是一个很好的解决方案吗?
[HttpDelete("post/{postId}")]
[Authorize(Roles = "User")]
public async Task<IActionResult> DeleteUserPost(int postId, CancellationToken ct)
{
_mediator.Send(new DeletePostCommand(postId), ct);
return Ok("Post deleted.");
}
UserId 将根据 HttpContext 和当前授权用户而不是端点的参数在命令处理程序中设置。它应该阻止用户删除其他人的帖子吗?
是的。目前,具有“用户”角色的每个人都可以删除任何帖子。 如果您想防止用户删除帖子,他们没有创建您应该将 UserId 存储在帖子中并在 CommandHandler 或直接在控制器中检查它(取决于您的喜好)。
类似:
if(post.UserId != userId){
// Throw exception or return a result indicating the deletion failed because of authorization
...
}
//
Handle your deletion
是的,直接在端点中使用
userId
参数允许任何具有 User
角色的用户删除任何其他用户的帖子。
您可以从
HttpContext
检索经过身份验证的用户 ID,并使用它来确保用户只能删除自己的帖子。
这只是一个例子:
[HttpDelete("post/{postId}")]
[Authorize(Roles = "User")]
public async Task<IActionResult> DeleteUserPost(int postId, CancellationToken ct)
{
var userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier)?.Value);
if (userId == 0)
{
return Unauthorized("Invalid user ID.");
}
_mediator.Send(new DeletePostCommand(userId, postId), ct);
return Ok("Post deleted.");
}