.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
相关产品推荐
相关产品推荐

