.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
相关产品推荐
相关产品推荐

