.Net Core Identity 在 .Net Core 5.0 中添加公司名称作为用户登录过程的一部分

.Net Core Identity Add Company Name As Part Of User Login Process In .Net Core 5.0

是否可以在 .Net Core Identity 中使用额外的用户字段进行用户登录?我想允许用户使用电子邮件、密码和第三个字段登录,即 Company Name,这是我在 ApplicationUser class 中定义的自定义字段,继承自 IdentityUser class

我的 ApplictionUser class:

public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string CompanyName { get; set; }
    }

它工作正常。我可以在注册时为用户添加公司名称。

这是身份脚手架创建的身份输入模型代码:

public class InputModel
        {
            [Required]
            [EmailAddress]
            public string Email { get; set; }

            [Required]
            [DataType(DataType.Password)]
            public string Password { get; set; }

            [Required]
            [Display(Name = "Company Name")]
            public string CompanyName { get; set; }

            [Display(Name = "Remember me?")]
            public bool RememberMe { get; set; }
        }

我在此处添加了 CompanyName 额外字段。现在我想根据这些字段登录用户。如果用户在登录页面提供的公司名称正确,则允许用户登录,否则不予登录。

我正在 Login.cshtml.cs 文件的 OnPostAsync method 中执行以下自定义代码:

var user = await _userManager.FindByEmailAsync(Input.Email);
            ApplicationUser user = new ApplicationUser
            {
                Email = Input.Email,
                UserName = Input.Email,
                CompanyName = Input.CompanyName,
            };
        
        var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: false);

但每次尝试的结果总是失败。我做错了什么吗?

您似乎正在用您的新实现覆盖 user 对象,它没有密码散列来检查(除其他外)。

直接检查user公司名称是否正确可能更简单,如果不匹配则抛出错误,如下:

var user = await _userManager.FindByEmailAsync(Input.Email);

if (user == null || user.CompanyName != Input.CompanyName) {
    ModelState.AddModelError("", "Invalid login attempt");
    return View(model);
}

var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);