如何在C# .NET后端验证被修改的Firebase JWT Token
问题根因
- JWT本身具备防篡改的安全设计,Firebase 官方签发的JWT由Firebase服务端私钥签名,前端修改Token的payload(比如新增角色属性)后,没有对应私钥重新生成合法签名,篡改后的Token本身属于无效凭证,校验失败是正常的安全拦截逻辑。
- 你看到的
The signature key was not found报错具体有两个触发可能:一是篡改Token时损坏了头部的kid(密钥标识)字段,校验逻辑无法从Firebase公开的JWKS密钥列表中找到对应标识的公钥;二是签名和公钥完全不匹配,.NET JWT校验中间件会抛出该类错误,重复报错大概率是你配置了多次JWT校验中间件、或者请求匹配了多条校验规则导致的。
正确解决步骤
- 立刻停止前端直接修改Firebase JWT的操作,所有自定义用户属性必须通过服务端注入,可选两种实现方案:
- 使用Firebase自定义声明:在你的.NET后端接入Firebase Admin SDK,调用
SetCustomUserClaims方法将角色、权限等自定义属性写入对应Firebase用户的声明中,后续Firebase签发的JWT会自动携带这些属性,签名合法,你原有校验逻辑无需修改即可正常读取属性。 - 自建Token签发层:用户登录时先校验Firebase原生Token的合法性,校验通过后,你的.NET后端用自己的密钥重新签发包含自定义角色属性的JWT,后续前端携带该自建Token请求接口,校验逻辑也对应切换为自有密钥的校验规则即可。
- 使用Firebase自定义声明:在你的.NET后端接入Firebase Admin SDK,调用
- 开发环境临时调试可以临时关闭签名校验(生产环境绝对禁止),参考配置代码:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = false, // *仅开发环境临时关闭,生产环境必须开启* ValidIssuer = "https://securetoken.google.com/你的Firebase项目ID", ValidAudience = "你的Firebase项目ID" }; });
- 解决重复报错问题:检查
Program.cs/Startup.cs中的中间件注册逻辑,确保JWT校验中间件只注册一次,且没有给同一接口配置多个鉴权规则。
内容的提问来源于stack exchange,提问作者Ferran R.
相关产品推荐
相关产品推荐

