You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core7 Identity+JWT认证异常:过期Token仍通过校验

ASP.NET Core Identity + JWT认证过期校验失效问题及排查

已找到的解决方案

将TokenValidationParameters中的ClockSkew设置为TimeSpan.Zero

问题场景与配置

我在使用ASP.NET Core Identity框架结合JWT实现认证功能,已完成以下配置:

1. Identity服务注入

builder.Services.AddIdentity<AppUser, IdentityRole>(options =>
    {
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequireUppercase = false;
        options.Password.RequireLowercase = false;
        options.Password.RequireDigit = false;
        options.Password.RequiredUniqueChars = 1;
        options.Password.RequiredLength = 8;
        options.Lockout.AllowedForNewUsers = true;
        options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
    })
    .AddEntityFrameworkStores<ApplicationDbContext>();

2. JWT中间件配置

builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, config =>
    {
        var _configuration = builder.Configuration;
        JwtSettings jwtSettings = _configuration.GetSection("Auth").Get<AuthSettings>()!.Jwt; // 已做非空校验

        var secretKey = jwtSettings.Key;

        config.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidIssuer = jwtSettings.Issuer,
            ValidAudience = jwtSettings.Audience,
            ValidateAudience = true,
            ValidateIssuer = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),
            ClockSkew = TimeSpan.Zero // 默认Token有5分钟的偏移量,手动配置后可支持短于5分钟的有效期
        };
    });

3. 受保护的控制器方法

[Authorize()]
[HttpGet()]
public IActionResult Secret()
{
    return Ok();
}

4. Token生成代码

public string GenerateAccessToken(IEnumerable<Claim> claims)
{
    var jwtSettings = _authSettings.Jwt;

    var secretKey = jwtSettings.Key;
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
    var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        jwtSettings.Issuer,
        jwtSettings.Audience,
        claims,
        expires: DateTime.Now.ToUniversalTime(),,
        signingCredentials: signingCredentials
        );

    return new JwtSecurityTokenHandler().WriteToken(token);
}

问题描述

我生成JWT时将过期时间设置为当前UTC时间(即Token生成瞬间就已过期),但携带该过期Token请求Secret接口时,请求仍能通过认证校验。我已尝试调整Identity与JWT配置的注册顺序,问题依旧存在。

请问问题出在哪里?


内容的提问来源于stack exchange,提问作者x_a1r_x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:25:07