ASP NET Core JWT身份验证允许过期的令牌

时间:2018-09-18 06:01:47

标签: c# angular asp.net-core asp.net-core-webapi

出于某种原因,我的RESTful应用允许在一段时间内允许来自Angular客户端的令牌过期请求。 生成令牌:

private async Task<string> GenerateJwtToken(ApplicationUser user)
{
    var claims = new List<Claim>
    {
        new Claim(JwtRegisteredClaimNames.Sub, user.Email),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
        new Claim(ClaimTypes.NameIdentifier, user.Id)
    };
    claims.AddRange(await _userManager.GetClaimsAsync(user));
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("SigningKey").Value));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var expires = 
        DateTime.Now.AddSeconds(10);
        //DateTime.Now.AddDays(Convert.ToDouble(_configuration["ExpireDays"]));

    var token = new JwtSecurityToken(
        issuer: _configuration["Issuer"],
        audience: _configuration["Audience"],
        claims: claims,
        expires: expires,
        signingCredentials: creds);
    return new JwtSecurityTokenHandler().WriteToken(token);
}
在请求之前,我在客户端上记录

我的过期时间,现在,如果现在超过过期时间。两个成功请求的日志,但是最后一个应该失败

  

t:2018年9月18日星期二08:53:43 GMT + 0300(莫斯科标准时间)   certificate-service.ts:101

     

现在:2018年9月18日星期二08:53:41 GMT + 0300(莫斯科标准时间)   certificate-service.ts:102

     

false

true表示已过期

  

credentials-service.ts:100 t:2018年9月18日星期二08:53:43 GMT + 0300   (莫斯科标准时间)

     

credentials-service.ts:101现在:2018年9月18日星期二08:58:01 GMT + 0300   (莫斯科标准时间)

     

credentials-service.ts:102

     

true

由于某种原因,我只在5-6分钟后被拒绝,而不是10秒。

1 个答案:

答案 0 :(得分:7)

在Startup.cs中定义TokenValidationParameters的地方,将ClockSkew属性的TimeSpan值设置为零:

ClockSkew = TimeSpan.Zero,例如:

new TokenValidationParameters
                {
                    IssuerSigningKey = signingKey,
                    ValidIssuer = issuer,
                    ValidAudience = audience,
                    ValidateLifetime = true,

                    ClockSkew = TimeSpan.Zero
                };

其原因是ClockSkew的默认值为5分钟