.NET+Angular登录系统如何用数据库数据替换静态数据做登录校验
登录逻辑实现方案
核心问题修正
- 你写的
FindAsync是异步方法,必须加await关键字才能拿到实际的Benutzer实体对象,否则你拿到的是未执行的异步任务对象。另外FindAsync仅支持按表主键查询,如果你的Benutzer表主键不是benutzername字段,建议改用FirstOrDefaultAsync按用户名过滤查询。 - 密码校验逻辑分为测试场景和生产场景两种实现,绝对不要在生产环境明文存储用户密码。
完整实现代码
基础测试版本(明文密码仅用于测试)
首先将接口改为异步实现,新增数据库查询和密码校验逻辑:
using Microsoft.EntityFrameworkCore; // 要引入这个命名空间才能用FirstOrDefaultAsync //Login [HttpPost("login/")] public async Task<IActionResult> Login([FromBody]Benutzer user) { if(user == null) { return BadRequest(); } // 按用户名查询对应用户 var currentUser = await _context.Benutzer.FirstOrDefaultAsync(u => u.benutzername == user.benutzername); // 用户名不存在直接返回未授权 if(currentUser == null) { return Unauthorized(); } // 明文密码校验(仅测试用) if(currentUser.passwort == user.passwort) { var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("superSecretKey@345")); var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256); var tokenOptions = new JwtSecurityToken ( issuer: "http://localhost:5000", audience: "http://localhost:5000", claims: new List<Claim>(), expires: DateTime.Now.AddMinutes(5), signingCredentials: signingCredentials ); var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions); return Ok(new { Token = tokenString }); } return Unauthorized(); }
生产环境版本(哈希密码校验)
生产环境必须存储加密后的密码哈希,推荐用.NET自带的PasswordHasher实现,不需要引入额外第三方包:
- 注册用户时的密码加密逻辑:
using Microsoft.AspNetCore.Identity; // 引入PasswordHasher所在命名空间 // 注册时把明文密码转成哈希再存库 var newUser = new Benutzer(); var passwordHasher = new PasswordHasher<Benutzer>(); newUser.passwort = passwordHasher.HashPassword(newUser, 注册时用户输入的明文密码); // 把newUser存进数据库
- 登录时的密码校验逻辑,替换上面测试版本的明文校验代码即可:
var passwordHasher = new PasswordHasher<Benutzer>(); var verifyResult = passwordHasher.VerifyHashedPassword(currentUser, currentUser.passwort, user.passwort); if(verifyResult == PasswordVerificationResult.Success) { // 密码校验通过,执行生成JWT的逻辑 }
内容的提问来源于stack exchange,提问作者Chopper
相关产品推荐
相关产品推荐

