.NET Identity 无需控制器将aspnetusers的UserId插入自定义表
实现方案
你不需要在控制器层传递UserId,直接在服务层通过依赖注入获取当前请求上下文的登录用户信息,即可完成ClientId字段赋值,具体操作如下:
前置配置
首先在Program.cs中注册HTTP上下文访问服务,用于在非控制器层获取当前登录用户信息:
// 注册IHttpContextAccessor builder.Services.AddHttpContextAccessor();
服务层代码修正
- 给你的服务实现类注入三个依赖:数据库上下文
ApplicationDbContext、用户管理服务UserManager<ApplicationUser>、HTTP上下文访问器IHttpContextAccessor - 修复原代码中的变量名冲突、笔误问题(原代码混用
WorkOutItem、invoice变量,会直接导致编译失败) - 通过
UserManager配合HTTP上下文拿到当前登录用户Id,直接赋值给ClientId外键字段即可
完整可运行代码:
public class WorkoutServices : IWorkoutServices { private readonly ApplicationDbContext _context; private readonly UserManager<ApplicationUser> _userManager; private readonly IHttpContextAccessor _httpContextAccessor; // 构造函数注入依赖,无需控制器传参 public WorkoutServices( ApplicationDbContext context, UserManager<ApplicationUser> userManager, IHttpContextAccessor httpContextAccessor) { _context = context; _userManager = userManager; _httpContextAccessor = httpContextAccessor; } public async Task<WorkOutItems> CreateTodo(WorkOutItems WorkOutItem) { // 获取当前登录用户信息 var currentUser = await _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User); if (currentUser == null) { throw new UnauthorizedAccessException("请先登录再操作"); } var newWorkOutItem = new WorkOutItems(); newWorkOutItem.ItemName = "Computer"; newWorkOutItem.CountOfItemName = 500; newWorkOutItem.ClientId = currentUser.Id; // 直接赋值用户Id即可 _context.WorkOutItems.Add(newWorkOutItem); await _context.SaveChangesAsync(); return newWorkOutItem; } // 其余接口方法实现略 public Task<List<WorkOutItems>> getTodoList() => throw new NotImplementedException(); public Task<WorkOutItems> GetToDoListById(int id) => throw new NotImplementedException(); public Task UpdatePlayer(WorkOutItems TodoItems) => throw new NotImplementedException(); public Task DeletePlayer(WorkOutItems TodoItems) => throw new NotImplementedException(); }
注意事项
- 实体中的
Client导航属性不需要手动赋值,EF Core会自动根据ClientId外键维护表关联关系,查询时调用Include(w => w.Client)即可加载关联的AspNetUsers用户数据 - 整个逻辑完全在服务层闭环,不需要控制器额外传递用户参数,符合你的需求
- 原代码中方法参数和内部实例化对象重名、使用未定义的
invoice变量属于低级笔误,编写时注意变量命名避免这类编译错误
内容的提问来源于stack exchange,提问作者John Pham
相关产品推荐
相关产品推荐

