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

.Net Core 5.0 Identity如何在登录流程中加入公司名称校验

实现方案说明

.Net Core Identity完全支持自定义字段参与登录校验,你当前的实现存在核心逻辑错误导致校验失败:

问题原因

  • 你先通过_userManager.FindByEmailAsync(Input.Email)查询到了数据库中存储的真实用户对象,但后续手动new了一个ApplicationUser对象直接覆盖了之前的user变量。这个新创建的对象没有携带数据库中存储的用户密码哈希、主键ID等核心标识,PasswordSignInAsync拿到未持久化的临时对象自然无法完成密码校验。
  • 你没有对查询到的真实用户的CompanyName字段和用户输入的内容做比对,缺失自定义字段的校验逻辑。

正确实现代码

修改Login.cshtml.cs中OnPostAsync方法的逻辑如下:

// 1. 按邮箱查询数据库中的真实用户
var user = await _userManager.FindByEmailAsync(Input.Email);
if (user == null)
{
    ModelState.AddModelError(string.Empty, "登录信息无效");
    return Page();
}

// 2. 校验自定义公司名称是否匹配
if (user.CompanyName != Input.CompanyName)
{
    ModelState.AddModelError(string.Empty, "登录信息无效");
    return Page();
}

// 3. 自定义字段校验通过后,调用密码校验接口,传入查询到的真实用户对象
var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: false);

特殊场景适配

如果你的业务允许同一个邮箱对应多个不同公司的用户,需要把邮箱和公司名作为联合查询条件,修改第一步的查询逻辑即可:

// 需先引入Microsoft.EntityFrameworkCore命名空间
var user = await _userManager.Users
    .FirstOrDefaultAsync(u => u.Email == Input.Email && u.CompanyName == Input.CompanyName);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:18:02