ASP.NET Core 2.0如何忽略JWT Bearer令牌签名验证?
实现ASP.NET Core 2.0 JWT Bearer中间件忽略签名验证
既然你的API已经部署在API网关之后,且网关已经完成了Bearer令牌的验证工作,那我们只需要调整JWT Bearer中间件的配置,让它跳过签名验证,同时保留从令牌中提取声明的能力即可。下面是具体的实现步骤:
核心配置修改
在Startup.cs的ConfigureServices方法中,配置JwtBearer中间件时,重点修改TokenValidationParameters里的验证参数:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; public void ConfigureServices(IServiceCollection services) { // 添加身份验证服务 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { // 关键:关闭签名验证,直接信任网关转发的令牌 ValidateSignature = false, // 由于网关已经验证过令牌的发行方和受众,这里可以关闭对应验证 ValidateIssuer = false, ValidateAudience = false, // 如果网关已经处理了令牌过期逻辑,也可以关闭生命周期验证 // 若需要保留令牌中的过期声明但不验证有效性,同样设为false ValidateLifetime = false, // 即使不验证签名,也需要指定一个密钥(因为框架要求非空,实际不会被使用) IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("any-dummy-key-here")) }; }); // 添加授权服务,支持基于声明的授权 services.AddAuthorization(); }
关键参数说明
ValidateSignature = false:这是实现忽略签名验证的核心,中间件不会再校验令牌的签名是否合法。ValidateIssuer/ValidateAudience:因为网关已经完成了这部分验证,关闭后可以减少不必要的计算开销。ValidateLifetime:如果网关已经拦截了过期令牌,关闭此项可以避免中间件再次校验过期时间;如果需要从令牌中读取exp声明但不验证,也保持为false即可。IssuerSigningKey:框架要求这个参数不能为null,所以随便填一个字符串转成密钥就行,因为ValidateSignature为false,它不会被实际使用。
注意事项
这种配置仅适用于API网关已经完全验证了令牌合法性的场景,绝对不能在没有网关保护的公开环境中使用,否则会导致恶意伪造的令牌也能通过验证,带来严重的安全风险。
内容的提问来源于stack exchange,提问作者Eli Algranti
相关产品推荐
相关产品推荐

