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

.NET+Angular登录系统如何用数据库数据替换静态数据做登录校验

登录逻辑实现方案

核心问题修正

  1. 你写的FindAsync是异步方法,必须加await关键字才能拿到实际的Benutzer实体对象,否则你拿到的是未执行的异步任务对象。另外FindAsync仅支持按表主键查询,如果你的Benutzer表主键不是benutzername字段,建议改用FirstOrDefaultAsync按用户名过滤查询。
  2. 密码校验逻辑分为测试场景和生产场景两种实现,绝对不要在生产环境明文存储用户密码。

完整实现代码

基础测试版本(明文密码仅用于测试)

首先将接口改为异步实现,新增数据库查询和密码校验逻辑:

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实现,不需要引入额外第三方包:

  1. 注册用户时的密码加密逻辑:
using Microsoft.AspNetCore.Identity; // 引入PasswordHasher所在命名空间

// 注册时把明文密码转成哈希再存库
var newUser = new Benutzer();
var passwordHasher = new PasswordHasher<Benutzer>();
newUser.passwort = passwordHasher.HashPassword(newUser, 注册时用户输入的明文密码);
// 把newUser存进数据库
  1. 登录时的密码校验逻辑,替换上面测试版本的明文校验代码即可:
var passwordHasher = new PasswordHasher<Benutzer>();
var verifyResult = passwordHasher.VerifyHashedPassword(currentUser, currentUser.passwort, user.passwort);
if(verifyResult == PasswordVerificationResult.Success)
{
    // 密码校验通过,执行生成JWT的逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:15:03