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

时间:2015-11-12 15:57:40

标签: asp.net-mvc owin asp.net-identity-2

我尝试通过"个人用户帐户"创建MVC 5和OWIN的新项目。问题是当我注册一个新帐户时,系统要求我输入一封电子邮件,然后该电子邮件将填充到数据库中的电子邮件和用户名。 当我尝试登录时,系统会要求我输入电子邮件,但会将该电子邮件与用户名列进行比较。所以Email和Username的值是相同的。以下登录代码正在执行登录(帐户控制器)

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

有没有办法比较输入的电子邮件和电子邮件列而不是用户名?

3 个答案:

答案 0 :(得分:4)

回答:

  

有没有办法比较输入的电子邮件和电子邮件列而不是用户名?

这可能不是最佳答案,但SignInManager应该可以访问具有Users属性的UserManager。 因此,您可以根据电子邮件查找用户,然后使用结果调用登录方法。

像这样(未经测试):

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失败相同。

答案 1 :(得分:1)

以下是@ChrisMoutray建议的操作,找到所提供电子邮件的用户名并登录。我把它放在这里。

实例化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;
        }

然后在Login(post)任务中:

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

PS。发现自己在这篇旧帖子中,所以只需添加一个有效的解决方案。

答案 2 :(得分: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);