You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core API基于Token认证限制用户删除任意表记录的问题咨询

.NET Core Web API 资源归属权限校验方案

你当前的问题核心是只完成了身份认证(校验用户是否登录、Token是否有效),缺失了资源级授权校验,没有验证当前用户是否对要操作的资源拥有权限,按照以下步骤即可修复:

步骤1:生成JWT时存入用户唯一标识

生成Token的逻辑中,需要将用户唯一ID写入JWT的Claims声明中,示例代码如下:

// 构造JWT声明集合
var claims = new List<Claim>
{
    // 存储用户唯一ID,使用系统内置的NameIdentifier声明类型即可
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    // 原有其他声明(用户名、角色等)保持不变
};
// 原有生成JWT的逻辑保持不变

步骤2:删除接口提取当前登录用户ID

在需要做权限控制的接口中,直接从HttpContext.User中提取当前登录用户的ID:

[HttpDelete("{recordId}")]
[Authorize] // 你已配置的JWT认证注解保持不变
public async Task<IActionResult> DeleteUserRecord(int recordId)
{
    // 提取当前登录用户的唯一ID
    var currentUserId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier));

    // 后续加入资源归属校验逻辑
}

步骤3:增加资源归属校验

查询待删除记录时,同时匹配记录ID和当前用户ID,确保只有资源所属用户才能操作:

// 错误写法:仅按记录ID查询,任意登录用户只要传对记录ID即可操作
// var targetRecord = await _context.UserRecords.FindAsync(recordId);

// 正确写法:同时匹配记录ID和所属用户ID
var targetRecord = await _context.UserRecords
    .FirstOrDefaultAsync(r => r.Id == recordId && r.UserId == currentUserId);

if (targetRecord == null)
{
    // 记录不存在或不属于当前用户,统一返回404或403均可
    return NotFound("目标记录不存在或无操作权限");
}

// 校验通过后执行删除逻辑
_context.UserRecords.Remove(targetRecord);
await _context.SaveChangesAsync();
return Ok("删除成功");
}

可选优化:通用化校验逻辑

如果项目中有大量接口需要做类似的资源归属校验,可以将校验逻辑抽离避免重复代码:

  • 自定义Action过滤器,将资源归属校验逻辑统一写到过滤器中,通过注解的方式挂载到需要的接口上
  • 基于ASP.NET Core 自带的Policy授权机制,创建自定义资源授权策略,全局处理归属校验逻辑

内容的提问来源于stack exchange,提问作者B4CK3NDD3V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:45:03