Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 刷新过期的令牌Web API_C#_Asp.net Core_Jwt_Asp.net Core Identity - Fatal编程技术网

C# 刷新过期的令牌Web API

C# 刷新过期的令牌Web API,c#,asp.net-core,jwt,asp.net-core-identity,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 != nul

下面的代码可以很好地从有效令牌(而不是过期令牌)生成新令牌

[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");
}
[HttpPost]
[路由(“刷新令牌”)]
公共异步任务刷新令牌()
{
var identity=用户身份作为索赔实体;
var username=identity.FindFirst(“用户”);
如果(username.Value!=null)
{
var user=await\u userManager.FindByNameAsync(username.Value);
var-token=GenerateToken(用户);
返回Ok(令牌);
}
返回BadRequest(“无法刷新令牌”);
}
尝试刷新无效令牌时,我会收到错误消息
NullReferenceException:objectreference未设置为对象的实例
。查看了错误日志后,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;

如果令牌过期,
identity.IsAuthenticated
false
,您无法获得索赔,因此
username
null
,效果很好我使用
IHttpContextAccessor
获取授权令牌,然后我从一开始就删除了
Bearer