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

.NET 7中动态生成JWT令牌及解决授权401问题

.NET 7 API中JWT令牌生成与验证的生产环境配置方案

问题场景

在.NET 7 API项目中,需要通过JWT令牌保护接口,供WinForms应用通过HttpClient安全访问。开发环境下使用dotnet user-jwts命令生成的令牌可以正常验证,但自行编写代码生成的令牌却返回401未授权错误,调整验证配置后问题解决,以下是标准化的生产环境配置方案。

初始配置的核心问题

最初的AddJwtBearer()调用未指定签名验证密钥,dotnet user-jwts生成的配置默认使用开发环境专属密钥,而自行生成令牌时使用的是自定义_securityKey,两端密钥不匹配导致验证失败。

生产环境配置步骤

1. 调整配置文件

移除appsettings.json中dotnet user-jwts自动生成的Authentication:Schemes:Bearer配置,添加自定义JWT配置项:

"JwtSettings": {
  "ValidIssuer": "https://your-production-domain.com",
  "ValidAudience": "https://your-production-domain.com",
  "SecretKey": "your-32bit-plus-strong-secret-key",
  "TokenExpiryMinutes": 50
}

2. 配置JWT验证服务

在Program.cs中替换原有的JWT验证配置,确保验证参数与令牌生成逻辑完全对齐:

// 绑定JWT配置到实体类
var jwtSettings = builder.Configuration.GetSection("JwtSettings").Get<JwtSettings>();

// 配置认证与授权
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = jwtSettings.ValidIssuer,
        ValidAudience = jwtSettings.ValidAudience,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey))
    };
});

builder.Services.AddAuthorization();

需要创建对应的配置实体类来绑定配置:

public class JwtSettings
{
    public string ValidIssuer { get; set; }
    public string ValidAudience { get; set; }
    public string SecretKey { get; set; }
    public int TokenExpiryMinutes { get; set; }
}

3. 标准化令牌生成代码

确保生成令牌时的发行方、受众、签名密钥与验证端完全一致,同时避免时区问题:

public class AuthService
{
    private readonly JwtSettings _jwtSettings;

    // 通过依赖注入获取JWT配置
    public AuthService(JwtSettings jwtSettings)
    {
        _jwtSettings = jwtSettings;
    }

    public string GenerateToken(User user)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, user.UserName),
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
            // 可根据需求添加角色、权限等自定义声明
        };

        var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));
        var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);

        var tokenOptions = new JwtSecurityToken(
            issuer: _jwtSettings.ValidIssuer,
            audience: _jwtSettings.ValidAudience,
            claims: claims,
            expires: DateTime.UtcNow.AddMinutes(_jwtSettings.TokenExpiryMinutes),
            signingCredentials: signingCredentials
        );

        return new JwtSecurityTokenHandler().WriteToken(tokenOptions);
    }
}

生产环境注意事项

  • 密钥安全性:生产环境的SecretKey必须是至少32位的随机字符串,开发环境可使用dotnet user-secrets set "JwtSettings:SecretKey" "your-strong-secret"管理,生产环境通过环境变量注入,禁止硬编码。
  • 参数一致性:发行方(Issuer)和受众(Audience)必须在生成和验证时完全一致,包括协议(http/https)和域名。
  • 时区处理:使用DateTime.UtcNow设置令牌过期时间,避免本地时区差异导致令牌提前失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:33:10