刷新过期令牌 Web API
Refresh expired token Web API
下面的代码可以很好地从有效令牌而非过期令牌生成新令牌。
[HttpPost]
[Route("refreshtoken")]
public async Task<IActionResult> RefreshToken()
{
var identity = User.Identity as ClaimsIdentity;
var username = identity.FindFirst("user");
if (username.Value != null)
{
var user = await _userManager.FindByNameAsync(username.Value);
var token = GenerateToken(user);
return Ok(token);
}
return BadRequest("Could not refresh token");
}
我一尝试刷新无效令牌,就收到错误消息 NullReferenceException: Object reference not set to an instance of an object
。然后查看了错误日志 username.Value == null
,看来我无法从过期的令牌中获得索赔。
是否有更好的方法从过期令牌生成刷新令牌?
您想做的是提取令牌本身的原理,大致如下:
//Create the token handler for the JWT validation
var tokenHandler = new JwtSecurityTokenHandler();
//Try and validate the token
var principal = tokenHandler.ValidateToken(token, tokenValidationParameters, out _);
一旦你有了令牌的主体,你就可以从中提取特定的声明,比如用户。例如,要获取电子邮件,您可以按照以下方式进行操作:
var emails = principal.Claims.First(c => c.Type == ClaimTypes.Email).Value;
下面的代码可以很好地从有效令牌而非过期令牌生成新令牌。
[HttpPost]
[Route("refreshtoken")]
public async Task<IActionResult> RefreshToken()
{
var identity = User.Identity as ClaimsIdentity;
var username = identity.FindFirst("user");
if (username.Value != null)
{
var user = await _userManager.FindByNameAsync(username.Value);
var token = GenerateToken(user);
return Ok(token);
}
return BadRequest("Could not refresh token");
}
我一尝试刷新无效令牌,就收到错误消息 NullReferenceException: Object reference not set to an instance of an object
。然后查看了错误日志 username.Value == null
,看来我无法从过期的令牌中获得索赔。
是否有更好的方法从过期令牌生成刷新令牌?
您想做的是提取令牌本身的原理,大致如下:
//Create the token handler for the JWT validation
var tokenHandler = new JwtSecurityTokenHandler();
//Try and validate the token
var principal = tokenHandler.ValidateToken(token, tokenValidationParameters, out _);
一旦你有了令牌的主体,你就可以从中提取特定的声明,比如用户。例如,要获取电子邮件,您可以按照以下方式进行操作:
var emails = principal.Claims.First(c => c.Type == ClaimTypes.Email).Value;