在ASP.NET Core Web API中实现JWT Token登录接口的需求
实现ASP.NET Core Web API的JWT登录接口
步骤1:确认依赖包
确保项目已安装Microsoft.AspNetCore.Authentication.JwtBearer包,可通过NuGet安装,或在项目的.csproj文件中添加以下引用(版本号根据你的.NET Core版本调整):
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />
步骤2:完善配置文件
补全appsettings.json中的Issuer,并新增Audience参数(JWT标准通常要求该参数):
"AppSettings": { "Issuer": "https://your-api-domain.com", "Audience": "https://your-api-domain.com", "Key" : "ThisIsMySecretKeyWith32BitLetters" }
步骤3:在Program.cs配置JWT认证服务
在Program.cs中添加JWT认证的服务配置:
var builder = WebApplication.CreateBuilder(args); // 读取AppSettings配置节点 var appSettings = builder.Configuration.GetSection("AppSettings"); // 注册JWT认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = appSettings["Issuer"], ValidAudience = appSettings["Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(appSettings["Key"])) }; }); // 注册控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 启用认证、授权中间件 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
步骤4:编写Token生成方法
在控制器中新增生成JWT Token的私有方法,同时需要向控制器注入IConfiguration以读取配置:
using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; // 控制器构造函数注入依赖 private readonly YourDbContext _mydb; private readonly IConfiguration _configuration; public YourController(YourDbContext mydb, IConfiguration configuration) { _mydb = mydb; _configuration = configuration; } // 生成JWT Token的私有方法 private string GenerateJwtToken(Login userFromDb) { var appSettings = _configuration.GetSection("AppSettings"); var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(appSettings["Key"])); var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); // 添加自定义Claims(可根据业务需求扩展,比如用户ID、角色等) var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, userFromDb.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim("UserId", userFromDb.Id.ToString()) // 假设Login实体包含Id字段 }; // 创建Token实例 var token = new JwtSecurityToken( issuer: appSettings["Issuer"], audience: appSettings["Audience"], claims: claims, expires: DateTime.Now.AddHours(2), // 设置Token有效期为2小时 signingCredentials: signingCredentials ); // 序列化Token为字符串返回 return new JwtSecurityTokenHandler().WriteToken(token); }
步骤5:修改登录接口返回Token
更新原登录接口,在验证通过后生成并返回Token:
[HttpPost("login")] public IActionResult Login(Login user) { // 注意:生产环境禁止明文存储/比对密码,必须使用哈希算法(如BCrypt)处理密码 var person = _mydb.Login .FirstOrDefault(c => c.Email == user.Email && c.password == user.password); if (person != null) { var token = GenerateJwtToken(person); return Ok(new { Token = token, Message = "Login successful" }); } else { return BadRequest("Authentication failed"); } }
重要注意事项
- 密码安全:生产环境必须使用哈希算法(如BCrypt、Argon2)存储用户密码,验证时比对哈希值,禁止明文操作。
- 密钥安全:不要将密钥硬编码在代码中,生产环境建议使用环境变量、Azure Key Vault等安全存储方案。
- Token有效期:可根据业务需求调整Token过期时间,复杂场景建议实现刷新Token机制,避免用户频繁登录。
内容的提问来源于stack exchange,提问作者Vengat Ramanan
相关产品推荐
相关产品推荐

