用电子邮件而不是用户名进行ASP.NET MVC登录

3

我尝试使用“个人用户账户”通过MVC 5和OWIN创建新项目。问题在于当我注册一个新账户时,系统要求我输入一个电子邮件地址,然后该电子邮件地址将被填充到数据库中的Email和Username两个字段中。 当我尝试登录时,系统要求我输入电子邮件地址,但是它将该电子邮件地址与Username列进行比较。因此,Email和Username的值是相同的。下面是在Action Login(Account Controller)中的登录代码。

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

有没有办法将输入的电子邮件与电子邮件列进行比较,而不是用户名?

2
你需要提供你的代码示例 - Chris Moutray
谢谢,我已经提供了登录代码,我们可以看到:model.Email -> 问题是系统将会将这个电子邮件与数据库中的用户名列进行比较。有没有办法将这个值与电子邮件列进行比较? - Anh Hoang
3个回答

4
回答: 有没有办法将输入的电子邮件与电子邮件列进行比较,而不是用户名?
这可能不是最好的答案,但SignInManager应该可以访问具有Users属性的UserManager。 因此,您可以根据电子邮件查找用户,然后使用结果调用signin方法。
类似于以下内容(未经测试):
var user = SignInManager.UserManage.Users.Where(u => u.email == model.Email).FirstOrDefault();
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);

您需要检查是否填写了user,否则返回“无效的登录详细信息”错误。如果PasswordSignInAsync失败,也是一样。


非常简单。在我的问题范围内,您的答案应该被接受。谢谢! - Anh Hoang

2

根据@ChrisMoutray的建议,找到提供的电子邮件地址对应的用户名并登录。以下是具体步骤:

  1. 实例化用户管理器(usermanager)和登录管理器(signinmanager)
private readonly SignInManager<ApplicationUser> signInManager;
private readonly UserManager<ApplicationUser> userManager;

        public AccountController(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
        {
            this.signInManager = signInManager;
            this.userManager = userManager;
        }

然后在登录(post)任务中:

  var user = await userManager.FindByEmailAsync(model.Email);
  var result = await signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);

PS. 发现自己在这篇旧帖子中,所以只是添加一个可行的解决方案。


0

原因是当您注册时,用户名等于电子邮件。

  public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);

当然,我们可以更改UserName = model.UserName,然后在登录时,我可以禁用电子邮件验证以输入用户名。但是我想输入电子邮件,因为电子邮件是唯一的。我只希望系统将输入的电子邮件与Email列进行比较。 - Anh Hoang
如果我们更改UserName =“John”,MVC将识别model.Email作为您登录的登录电子邮件。正如您可以从登录方法中看到的那样,它使用model.Email而不是model.UserName进行登录,因此我不确定您在比较输入电子邮件与电子邮件列时的意思,因为它已经存在。 - Julius Doan
1
@JuliusDoan 如果您深入研究ASP.Net Identity的底层代码,SignInManager.PasswordSignInAsync将比较发送到它的任何值与数据库中的“用户名”列。如果您更改注册代码以将非电子邮件地址设置为用户名,则登录将失败,因为它是硬编码为查看数据库的用户名字段,这使得使用电子邮件地址登录变得困难,如果您尝试分离用户名和电子邮件地址。我不得不实现自己的身份提供程序来解决我正在开发的网站上的同样问题。 - Jacqueline Loriault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接