身份MVC - 更改DB后无效的用户名或密码

时间:2014-08-04 10:13:46

标签: sql asp.net-mvc database identity asp.net-identity

在我更改web.config中的数据库后,添加了如下连接字符串:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;.....20140526021501;Integrated Security=True" providerName="System.Data.SqlClient" />
    <add name="identityDB" connectionString="Server=....Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" providerName="System.Data.SqlClient" />
  </connectionStrings>

当然&#34; DefaultConnection&#34;我总是在那里添加&#34; identityDB&#34;我正在使用它:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("identityDB")
        {
        }

注意:&#39; identityDB&#39;是Azure(云)中的SQL数据库。

问题:

当我在网站上注册时,用户将被添加到右侧表格中的所有数据库中(所有字段都正确且一切都很好)。

但是当我尝试使用我注册的用户名和密码登录时,我会获得&#34; Invaild用户名或密码&#34;消息,我不知道为什么......

我调试了一下,我可以在这里看到:

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindAsync(model.Email, model.Password);
                if (user != null)
                {
                    await SignInAsync(user, model.RememberMe);
                    return RedirectToLocal(returnUrl);
                }
                else
                {
                    ModelState.AddModelError("", "Invalid username or password.");
                }
            }

用户在&#34;中返回null,如果&#34;声明,有什么问题?我无法理解为什么我可以注册,但登录失败...

有人有想法吗?

2 个答案:

答案 0 :(得分:1)

问题:

出于某种原因这行代码:

await UserManager.FindAsync(model.Email, model.Password);
由于我理解“model.Email”与“model.userName”混合而且我没有“UserName”的这个属性所以我需要将此行更改为其他并且仍然执行相同的操作

解决方案:

我会传递我的代码,但首先要解释我做了什么:

我用几行完成了有问题的行,这些行按照不同的顺序执行了确切的操作:

  1. 首先检查电子邮件是否显示在数据库中。
  2. 如果是,我会检查密码,如果它没有打印无效的用户密码消息。
  3. 继续照常之后
  4. 这是我的代码:

     // POST: /Account/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                PasswordVerificationResult result = PasswordVerificationResult.Failed;
                //var user = await UserManager.FindAsync(model.Email, model.Password);
                var user = await UserManager.FindByEmailAsync(model.Email);
                if (user != null)
                {
                    result = UserManager.PasswordHasher.VerifyHashedPassword(user.PasswordHash, model.Password);
    
                    if (!(result == PasswordVerificationResult.Success))
                    {
                        ModelState.AddModelError("", "Invalid name or password.");
                    }
                    else
                    {
                        await SignInAsync(user, model.RememberMe);
                        return RedirectToLocal(returnUrl);
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Invalid username or password.");
                }
            }
    
            // If we got this far, something failed, redisplay form
            return View(model);
        }
    

    正如你所看到的那样,我采用了“有问题的路线”并对其进行了评论。

    希望它能帮助别人,祝你好运!

答案 1 :(得分:0)

我建议你更新Identity 2.0(但要小心)。也是通过这个连接字符串它应该工作我猜。你可以在db中注册用户但你无法使用它登录是很奇怪的。这可能意味着当您注册用户时,它会将其保存到您的数据库中,并在您登录时搜索您的本地数据库(您使用项目部署在azure上)。我会删除本地db和con字符串。但是如果你指定你的constring是没有意义的(检查所有con字符串,清除浏览器缓存做一些幻影技巧......)。其他可能是您输入了错误的密码。设置密码验证以允许您输入例如。 111111或一些简单的,以消除打字中的一些错误。