.NET Core 3.1读取appsettings.json凭据时JWT授权不生效问题
问题根因
授权失效核心是_users用户列表的初始化位置错误:
- 硬编码用户名密码时,你在
_users字段声明阶段就写入了用户信息,所有UserService实例创建时都会自带该用户,任何请求调用GetById方法都能查到对应数据 - 调整为读取配置后,你把加载配置、给
_users赋值的逻辑写在了Authenticate登录方法内部。ASP.NET Core默认服务注册生命周期为Scoped,即每个请求会生成独立的UserService实例:登录请求对应的实例里,_users确实被赋值了配置中的用户,可以正常生成令牌,但后续携带令牌访问受保护接口时,会创建全新的UserService实例,这个实例的_users是初始空列表,JWT中间件调用GetById查询用户时返回null,最终被授权过滤器判定为未授权。
修复方案
将配置读取、用户列表初始化逻辑移动到UserService构造函数中,保证所有服务实例创建时就完成用户加载,删除Authenticate方法内重复赋值_users的代码。
修改后的UserService核心代码如下:
public class UserService : IUserService { private readonly List<User> _users; private readonly AppSettings _appSettings; public UserService(IOptions<AppSettings> appSettings, IConfiguration configuration) { _appSettings = appSettings.Value; // 构造阶段一次性从配置读取用户信息,初始化用户列表 var configUsername = configuration.GetValue<string>("UserCred:Username"); var configPassword = configuration.GetValue<string>("UserCred:Password"); _users = new List<User> { new User { Username = configUsername, Password = configPassword } }; } public AuthenticateResponse Authenticate(AuthenticateRequest model) { // 移除原方法内读取配置、重新赋值_users的逻辑 var user = _users.SingleOrDefault(x => x.Username == model.Username && x.Password == model.Password); if (user == null) return null; var token = generateJwtToken(user); return new AuthenticateResponse(user, token); } // GetAll、GetById、generateJwtToken方法无需修改,保持原有逻辑即可 }
额外优化建议
- 读取嵌套配置可以直接用
配置节点:子节点的格式,比多次调用GetSection更简洁 - 可参考
AppSettings的强类型绑定方式,为UserCred节点也创建对应配置类,避免手动逐个读取配置值 - 当前使用的JWT密钥长度过短,生产环境建议替换为16位以上的随机复杂字符串,降低令牌被破解的风险
- JWT中间件中的空catch块建议补充日志记录逻辑,后续令牌验证失败时可以快速定位问题原因
内容的提问来源于stack exchange,提问作者arp
相关产品推荐
相关产品推荐

