ASP.NET Core使用Bearer令牌访问授权接口返回401未授权求助
问题排查与解决
1. 中间件顺序错误(核心原因)
你把认证与授权中间件的顺序写反了,ASP.NET要求先执行认证中间件,再执行授权中间件,否则授权逻辑无法获取到认证后的用户上下文,直接返回401。
错误代码:
app.UseAuthorization(); app.UseAuthentication();
修正后的正确顺序:
app.UseAuthentication(); app.UseAuthorization();
2. 其他补充排查要点
验证JWT令牌有效性:
手动解析生成的令牌,确认:- 签名算法和配置一致(你用的是HS256,对应
HmacSha256Signature) - 令牌未过期(检查
exp字段) - 令牌中包含
idclaim且格式为整数
- 签名算法和配置一致(你用的是HS256,对应
确认密钥完全一致:
生成JWT时使用的密钥,必须和认证配置里的settings.Bearer完全匹配,且编码方式统一(你用了Encoding.ASCII,生成令牌时也要用相同编码)。检查请求头格式:
确保请求头无多余空格,正确格式为:Authorization: Bearer <你的JWT令牌>,注意Bearer后只有一个空格。校验令牌生成逻辑:
确认_authService.Login里的JWT生成逻辑正确,示例正确写法如下:var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(settings.Bearer); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim("id", userId.ToString()) }), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token);
内容的提问来源于stack exchange,提问作者AtheroX
相关产品推荐
相关产品推荐

