JWT简单配置使用

JWT

webApi中配置

  1. 安装NuGet Microsoft.AspNetCore.Authentication.JwtBearer

  2. Swagger 添加 认证页面 代码注释由豆包生成

    // 配置 Swagger 生成器,添加 JWT 认证支持
    builder.Services.AddSwaggerGen(c =>
    {
        // 定义名为"Bearer"的安全方案,描述 JWT 在请求头中的格式
        c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
        {
            In = ParameterLocation.Header,      // JWT 令牌放置在请求头中
            Type = SecuritySchemeType.ApiKey,   // 采用 API Key 认证方式
            Description = "直接在下框中输入Bearer {token}(注意两者之间是一个空格)",
            Name = "Authorization",             // 请求头中的字段名
            BearerFormat = "JWT",               // 令牌格式为 JWT
            Scheme = "Bearer"                   // 认证方案名称
        });
        
        // 添加安全要求,强制所有 API 都需要 JWT 认证
        c.AddSecurityRequirement(new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference
                    {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"          // 引用上面定义的"Bearer"安全方案
                    }
                },
                new string[] {}                // 允许的安全范围(这里为空,表示所有范围)
            }
        });
    });
    
  3. 配置 JWT 认证服务

    // 配置 JWT 认证服务
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            // 设置令牌验证参数
            options.TokenValidationParameters = new TokenValidationParameters
            {
                // 验证签名密钥,确保令牌未被篡改
                ValidateIssuerSigningKey = true,
                // 指定用于验证签名的密钥(应与生成令牌时使用的密钥相同)
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("SDMC-CJAS1-SAD-DFSFA-SADHJVF-VFXH")),
                
                // 验证令牌颁发者(Issuer)
                ValidateIssuer = true,
                // 指定允许的令牌颁发者
                ValidIssuer = "http://localhost:6060",
                
                // 验证令牌接收者(Audience)
                ValidateAudience = true,
                // 指定允许的令牌接收者
                ValidAudience = "http://localhost:5000",
                
                // 验证令牌有效期
                ValidateLifetime = true,
                // 允许的时间偏移量(处理时钟不同步问题)
                ClockSkew = TimeSpan.FromMinutes(60)
            };
        });
    
  4. 应用认证和授权

    app.UseAuthentication();   // 启用身份验证中间件
    app.UseAuthorization();    // 启用授权中间件
    
  5. API控制器处理生成令牌

    var author = new 
    {
        Id = 1,
        UserAccount = userAccount,
        UserName = "TestUser"
    };
    if (author != null)
    {
        //登陆成功
        var claims = new Claim[]
            {
        new Claim(ClaimTypes.Name, author.UserAccount),
        new Claim("Id", author.Id.ToString()),
        new Claim("UserName", author.UserName)
                //不能放敏感信息 
            };
        var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("SDMC-CJAS1-SAD-DFSFA-SADHJVF-VFXH"));
        //issuer代表颁发Token的Web应用程序,audience是Token的受理者
        var token = new JwtSecurityToken(
            issuer: "http://localhost:6060",
            audience: "http://localhost:5000",
            claims: claims,
            notBefore: DateTime.Now,
            expires: DateTime.Now.AddHours(1),
            signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature)
        );
        var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
        return Ok(jwtToken);
    }
    else
    {
        return BadRequest("账户或者密码错误");
    }
    
  6. 在对应需要添加认证的资源(控制器/Action)添加 Authorize 特性就可以限制请求了

posted @ 2025-07-15 16:29  坐听风声雨声  阅读(19)  评论(0)    收藏  举报