我在 ASP.NET Core 中有这个 web api 方法:
[HttpPost("Refresh")]
public async Task<IActionResult> Refresh([FromBody]TokenRefreshDto tokenRefreshDto)
{
var principal = _userService.GetPrincipalFromExpiredToken(tokenRefreshDto.Token);
var username = principal.Identity.Name;
var user = await _userService.GetUserByUserName(username);
if (user == null || await _userManager.GetAuthenticationTokenAsync(user,"Default","RefreshToken") != tokenRefreshDto.RefreshToken) return BadRequest();
var newJwtToken = await _userService.GenerateJwtToken(user);
await _userManager.RemoveAuthenticationTokenAsync(user, "Default", "RefreshToken");
var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "Default", "RefreshToken");
await _userManager.SetAuthenticationTokenAsync(user, "Default", "RefreshToken", newRefreshToken);
return new ObjectResult(new
{
token = newJwtToken,
refreshToken = await _userManager.GetAuthenticationTokenAsync(user, "Default", "RefreshToken")
});
}
当我尝试刷新 RefreshToken 时,会出现以下错误:
InvalidOperationException: The instance of entity type "User" cannot be tracked
because another instance with the same key value for "Id" is already being tracked
我的 User 类是从 IdentityUser 派生的:
public class User : IdentityUser<int>
{
public string Name { get; set; }
public string LastName { get; set; }
public string MobilePhone { get; set; }
public string Address { get; set; }
public Guid? ShopId { get; set; }
public DateTime LastActive { get; set; }
public virtual Shop Shop { get; set; }
}