【问题标题】:Refresh expired token Web API刷新过期令牌 Web API
【发布时间】:2019-08-05 08:20:34
【问题描述】:

下面的代码可以很好地从一个有效的令牌生成新的令牌,而不是一个过期的令牌。

[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 所以看来我无法从过期令牌中获取声明。

有没有更好的方法从过期令牌生成刷新令牌?

【问题讨论】:

  • 如果token过期了,identity.IsAuthenticated就是false,你就不能得到索赔,所以username就是null

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


【解决方案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;

【讨论】:

  • 效果很好,我使用IHttpContextAccessor 获取授权令牌,然后我从一开始就删除了Bearer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2017-10-19
  • 2020-11-04
相关资源
最近更新 更多