.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
相关产品推荐
相关产品推荐

