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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:27:22