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

.NET Core 3.1 使用JwtBearer实现无过期JWT及移除nbf/iat默认声明问询

.NET Core 3.1 自定义JWT Token的实现方案

实现可行性说明

你提到的两项定制需求都可通过现有Microsoft.AspNetCore.Authentication.JwtBearer组件的原生配置实现,无需额外引入第三方库。该组件本身仅负责传入Token的校验逻辑,Token生成阶段的声明组装逻辑完全由业务代码自主控制,不受默认行为强制约束。

需求对应实现步骤

1. 实现Token永不过期

  • Token永不过期的核心是不在Token载荷中设置exp(过期时间)声明,同时在JwtBearer校验配置中关闭默认的生命周期校验逻辑,避免中间件因找不到过期字段判定Token无效
  • 校验层配置调整:
// Startup.cs 中的认证服务配置
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 关闭Token过期时间校验
            ValidateLifetime = false,
            // 保留原有签名、颁发者、受众的校验规则,不要全量关闭
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(你配置的Jwt签名密钥)),
            ValidateIssuer = true,
            ValidIssuer = 你配置的Token颁发者,
            ValidateAudience = true,
            ValidAudience = 你配置的Token受众
        };
    });

2. 移除Token默认携带的nbf(生效时间)、iat(签发时间)声明

  • 默认JwtSecurityTokenHandler在生成Token时,会自动把nbf、iat、exp等标准声明填充为当前系统时间,这个自动填充行为可通过手动传入参数覆盖、甚至直接移除对应字段实现
  • 手动组装Token的代码示例:
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(你配置的Jwt签名密钥));
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

// 仅保留业务需要的自定义声明,不额外添加标准默认声明
var businessClaims = new List<Claim>
{
    new Claim(ClaimTypes.Name, 业务对应用户标识),
    // 其他业务需要的自定义声明
};

// 手动构建Token载荷,直接移除默认会被自动填充的字段
var payload = new JwtPayload(businessClaims)
{
    ["nbf"] = null,
    ["iat"] = null,
    ["exp"] = null
};

// 基于自定义载荷生成Token
var token = new JwtSecurityToken(
    header: new JwtHeader(signingCredentials),
    payload: payload
);

var tokenString = new JwtSecurityTokenHandler().WriteToken(token);

实现注意事项

  • 关闭ValidateLifetime仅跳过Token的过期时间校验,不会影响签名、颁发者、受众等其他维度的校验安全性,不要因为调整需求随意关闭其他校验规则
  • 若生成Token后解码仍能看到nbf、iat字段,检查项目引用的System.IdentityModel.Tokens.Jwt版本,旧版本存在强制填充标准声明的逻辑,通过上述手动给payload字段赋值null的方式即可覆盖默认值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 11:45:03