.NET7中Refresh Token无法保存到数据库的问题求助
问题排查与修复
核心问题出在静态User对象的误用:
控制器中定义了public static User user = new User();这个静态全局对象,但在Login方法里你从数据库查询到的是另一个独立的var user实例。SetRefreshToken方法中修改的是静态对象的属性,而非数据库中查询出来的用户实例,所以调用_context.SaveChanges()时,EF Core不会检测到数据库用户实体的变化,自然不会更新数据库。
具体修复步骤
删除静态User字段
从UserAuthController中移除静态全局用户对象:// 删掉这行 // public static User user = new User();修改SetRefreshToken方法,接收数据库用户实例
让方法接收从数据库查询到的User对象,直接操作该实例的属性:private void SetRefreshToken(RefreshToken newRefreshToken, User user) { var cookieOptions = new CookieOptions { HttpOnly = true, Expires = newRefreshToken.Expired }; Response.Cookies.Append("refreshToken", newRefreshToken.Token, cookieOptions); // 直接更新数据库用户实例的属性,无需判断空值 user.RefreshToken = newRefreshToken.Token; user.TokenCreated = newRefreshToken.Created; user.TokenExpires = newRefreshToken.Expired; try { _context.SaveChanges(); } catch (Exception ex) { Console.WriteLine($"SaveChanges Error: {ex.Message}"); } }在Login方法中传入正确的用户实例
调用SetRefreshToken时,把从数据库查询到的user传进去:[HttpPost("login")] public ActionResult<User> Login(UserLoginDto userLoginDto) { var user = _context.Users.SingleOrDefault(x => x.Email == userLoginDto.Email); if (user == null) { return BadRequest("User not Found"); } if (!BCrypt.Net.BCrypt.Verify(userLoginDto.Password, user.PasswordHash)) { return BadRequest("Wrong Password"); } string token = CreateToken(user); var refreshToken = GenerateRefreshToken(); // 传入数据库查询到的user实例 SetRefreshToken(refreshToken, user); return Ok(token); }
额外检查点
- 确认数据库已同步User模型的变更:如果是首次添加
RefreshToken、TokenCreated、TokenExpires字段,需要执行EF Core迁移并更新数据库,确保这些字段在数据库表中存在。 - 检查
SaveChanges的异常日志:如果修改后仍有问题,查看控制台输出的异常信息,排查是否有其他数据库约束或字段类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Fatih Demirbaş
相关产品推荐
相关产品推荐

