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

ASP.NET Core Identity中JWT配置及签名验证失败问题排查

解决ASP.NET Core JWT签名验证失败及令牌生成逻辑问题

一、先搞定签名验证失败(IDX10503)的核心问题

从你的调试日志来看,当前最紧急的是签名验证不通过,我帮你梳理几个必查的关键点:

  1. 确保密钥完全一致
    你在Startup配置和令牌生成代码里都硬编码了同一个密钥字符串,但手动输入/复制很容易出现细微差异(比如多空格、字符遗漏)。建议把密钥移到appsettings.json统一管理,两边都从配置读取,彻底避免人为错误:
// appsettings.json
"JwtSettings": {
  "SecretKey": "fbsghfdgjdgfjdbjgbjdbgjdbgjbdfjgbdfgjdbgjbfjdgbjdfgb",
  "Issuer": "https://URL",
  "Audience": "https://URL"
}

然后在Startup中读取配置:

var jwtSettings = Configuration.GetSection("JwtSettings");
options.TokenValidationParameters = new TokenValidationParameters {
    // 保留你原有其他配置
    ValidIssuer = jwtSettings["Issuer"],
    ValidAudience = jwtSettings["Audience"],
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["SecretKey"]))
};

令牌生成时也从配置读取密钥和发行者/受众信息,确保100%一致。

  1. 修正Issuer的拼写错误
    你生成令牌时写的是issuer: "https:/URL"(少了一个斜杠),虽然Startup里设置了ValidateIssuer = false不会校验发行者,但为了规范和避免潜在问题,建议统一改成"https://URL",和配置里的保持一致。

  2. 确认签名算法匹配
    你生成令牌用的是SecurityAlgorithms.HmacSha256,JWT Bearer默认验证算法也是这个,这部分是匹配的,没问题。如果后续修改算法,一定要确保两边同步。

二、令牌生成的正确逻辑:必须用UserManager+SignInManager

你纠结的“是否用现有登录逻辑”,答案是一定要用,原因很实在:

  • _signInManager.CheckPasswordSignInAsync不只是校验密码对错,还会自动处理用户锁定、密码过期、是否允许登录等框架内置的安全逻辑,比自己手动验证密码哈希靠谱多了。
  • 你当前的代码其实已经这么做了,这部分是对的!不过可以再优化下,给令牌添加更多有用的Claims:
// 生成Claims时,加入用户ID、角色等信息
var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.Sub, user.Email),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim(ClaimTypes.NameIdentifier, user.Id),
    new Claim(ClaimTypes.Email, user.Email)
};
// 如果需要角色权限,还可以追加角色Claims
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
    claims.Add(new Claim(ClaimTypes.Role, role));
}

另外,你的[Authorize]属性配置是对的,指定AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme能确保用JWT验证,而不是默认的Cookie验证(这也是之前被重定向到登录页的原因)。

最后做个验证测试

  1. 确保密钥、Issuer、Audience在Startup和令牌生成代码中完全一致;
  2. 重启服务,调用/token3获取新令牌;
  3. 调用/test接口时,在请求头里添加Authorization: Bearer <你的令牌>;
  4. 查看调试日志,如果OnTokenValidated触发,说明验证成功了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:25:20