在命令处理程序中授权操作

问题描述 投票:0回答:2

我在 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 和当前授权用户而不是端点的参数在命令处理程序中设置。它应该阻止用户删除其他人的帖子吗?

c# .net authentication controller authorization
2个回答
0
投票

是的。目前,具有“用户”角色的每个人都可以删除任何帖子。 如果您想防止用户删除帖子,他们没有创建您应该将 UserId 存储在帖子中并在 CommandHandler 或直接在控制器中检查它(取决于您的喜好)。

类似:

    if(post.UserId != userId){
// Throw exception or return a result indicating the deletion failed because of authorization
...
}
//

Handle your deletion

0
投票

是的,直接在端点中使用

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.");
}
© www.soinside.com 2019 - 2024. All rights reserved.