刷新过期的令牌Web API

时间:2019-03-14 12:26:29

标签: c# asp.net-core jwt asp.net-core-identity

下面的代码可以很好地从有效令牌生成新令牌,但不能过期。

[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,看来我无法从过期的令牌中获得索赔。

是否有更好的方法可以从过期的令牌生成刷新令牌?

1 个答案:

答案 0 :(得分:1)

您想要做的是提取令牌本身的原理,类似于以下内容:

//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;