public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            var user = await UserManager.FindAsync(model.Email, model.Password);
            if (user != null)
            {
                if (!user.EmailConfirmed)
                {
                    ModelState.AddModelError("", "Email address has not been confirmed.");
                    await UserManager.GenerateEmailConfirmationEmailAsync(Url, user.Id);
                    return View(model);
                }
            }
            else
            {
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
            }

            var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
            switch (result)
            {
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);

                case SignInStatus.Failure:
                default:
                    ModelState.AddModelError("", "Invalid login attempt.");
                    return View(model);
            }
        }
        public async Task SubmitLoginValidModelRemoteUrlRemembered()
        {
            var loginModel = new LoginViewModel
            {
                Email = ConfirmedGoodUsername,
                Password = ConfirmedGoodPassword,
                RememberMe = true
            };

            await SubmitLogin(loginModel, ExternalUri, redirectToHome: true);
        }
        private async Task SubmitLogin(LoginViewModel loginModel, string returnUrl,
            bool verificationFail = false, bool validationFail = false, bool redirectToUri = false, bool redirectToHome = false)
        {
            var userManager = CreateMockUserManager();
            var signInManager = CreateMockSignInManager();
            var urlHelper = CreateMockUrlHelper();

            var controller = new AccountController(userManager.Object, signInManager.Object, urlHelper.Object);

            var vals = Validate(loginModel);

            foreach (var v in vals)
            {
                foreach (var m in v.MemberNames)
                    controller.ModelState.AddModelError(m, v.ErrorMessage);
            }

            var result = await controller.Login(loginModel, returnUrl);

            Assert.IsTrue(verificationFail || validationFail || redirectToUri || redirectToHome);

            if (verificationFail)
            {
                var vr = result as ViewResult;

                userManager.Verify(m => m.FindAsync(loginModel.Email, loginModel.Password), Times.AtLeastOnce);
                signInManager.Verify(m => m.PasswordSignInAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()), Times.Never);

                Assert.IsNotNull(vr);
                Assert.AreEqual(loginModel, vr.Model);
            }
            else if (validationFail)
            {
                var vr = result as ViewResult;

                userManager.Verify(m => m.FindAsync(It.IsAny<string>(), It.IsAny<string>()), Times.Never);
                signInManager.Verify(m => m.PasswordSignInAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()), Times.Never);

                Assert.IsNotNull(vr);
                Assert.AreEqual(loginModel, vr.Model);
            }
            else if (redirectToUri)
            {
                var rr = result as RedirectResult;

                userManager.Verify(m => m.FindAsync(loginModel.Email, loginModel.Password), Times.AtLeastOnce);
                signInManager.Verify(m => m.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, false), Times.Once);
                urlHelper.Verify(m => m.IsLocalUrl(returnUrl), Times.AtLeastOnce);

                Assert.IsNotNull(rr);
                Assert.AreEqual(returnUrl, rr.Url);
                Assert.AreEqual(false, rr.Permanent);
            }
            else if (redirectToHome)
            {
                var rr = result as RedirectToRouteResult;

                userManager.Verify(m => m.FindAsync(loginModel.Email, loginModel.Password), Times.AtLeastOnce);
                signInManager.Verify(m => m.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, false), Times.Once);
                urlHelper.Verify(m => m.IsLocalUrl(returnUrl), Times.AtLeastOnce);

                Assert.IsNotNull(rr);
                Assert.AreEqual("Index", rr.RouteValues["action"]);
                Assert.AreEqual("Home", rr.RouteValues["controller"]);
                Assert.AreEqual(false, rr.Permanent);
            }
        }
        public async Task SubmitLoginValidModelNoUrlUnconfirmedEmailRemembered()
        {
            var loginModel = new LoginViewModel
            {
                Email = UnconfirmedGoodUsername,
                Password = UnconfirmedGoodPassword,
                RememberMe = true
            };

            await SubmitLogin(loginModel, null, verificationFail: true);
        }
        public async Task SubmitLoginValidModelNoUrlConfirmedEmailNotRemembered()
        {
            var loginModel = new LoginViewModel
            {
                Email = ConfirmedGoodUsername,
                Password = ConfirmedGoodPassword,
                RememberMe = false
            };

            await SubmitLogin(loginModel, null, redirectToHome: true);
        }
        public async Task SubmitLoginNoUsername()
        {
            var loginModel = new LoginViewModel
            {
                Email = null,
                Password = ConfirmedGoodPassword,
                RememberMe = true
            };

            await SubmitLogin(loginModel, null, validationFail: true);
        }
        public async Task SubmitLoginNoDetails()
        {
            var loginModel = new LoginViewModel
            {
                Email = null,
                Password = null,
                RememberMe = true
            };

            await SubmitLogin(loginModel, null, validationFail: true);
        }
        public async Task SubmitLoginBadPassword()
        {
            var loginModel = new LoginViewModel
            {
                Email = ConfirmedGoodUsername,
                Password = BadPassword,
                RememberMe = true
            };

            await SubmitLogin(loginModel, null, verificationFail: true);
        }