public async Task <ActionResult> TokenLogin(LoginViewModel model, string returnUrl) { ViewBag.ReturnUrl = returnUrl; ViewBag.LiveDemoMemberships = Demo.GetLiveDemoMemberships(); ViewBag.EnableDemo = (ViewBag.LiveDemoMemberships != null && ViewBag.LiveDemoMemberships.Count > 0); ViewBag.EnableMobil = UserManager.TwoFactorProviders.ContainsKey("PhoneCode"); model.LoginState = LoginViewModel.State.TokenLogin; if (!model.MobilNumberValidated) { if (!MobilNumberValidator.IsValid(model.MobilNumber, true)) { ModelState.AddModelError("MobilNumber", "Der blev ikke fundet en pilot med dette nummer."); return(View("Login", model)); } else { model.MobilNumberValidated = true; model.MobilNumber = MobilNumberValidator.ParseMobilNumber(model.MobilNumber); var result = await SignInHelper.MobilSignIn(model.MobilNumber, model.RememberBrowser); switch (result) { case SignInStatus.LockedOut: return(View("Lockout")); case SignInStatus.UnConfirmed: case SignInStatus.Success: case SignInStatus.RequiresTwoFactorAuthentication: model.MobilNumberValidated = true; // Does not function because we are working prior to cookies being written. //var userId = await SignInHelper.GetVerifiedUserIdAsync(); var user = await UserManager.FindByNameAsync(model.MobilNumber); var userId = user.Id; if (userId == null) { model.MobilNumberValidated = false; ModelState.AddModelError("MobilNumber", "Unable to find verified user"); return(View("Login", model)); } var userFactors = await UserManager.GetValidTwoFactorProvidersAsync(userId); if (userFactors.All(p => p != "PhoneCode")) { model.MobilNumberValidated = false; ModelState.AddModelError("MobilNumber", "SMS Provider not available"); return(View("Login", model)); } if (!await SignInHelper.SendTwoFactorCode("PhoneCode", userId)) { model.MobilNumberValidated = false; ModelState.AddModelError("MobilNumber", "Unable to send verification code"); return(View("Login", model)); } if (HttpContext.IsDebuggingEnabled) { // To exercise the flow without actually sending codes, uncomment the following line ModelState.AddModelError("VerifyCode", "For DEMO purposes the current verification code is: " + await UserManager.GenerateTwoFactorTokenAsync(userId, "PhoneCode")); } return(View("Login", model)); case SignInStatus.Failure: default: model.MobilNumberValidated = false; ModelState.AddModelError("MobilNumber", "Unable to sign-in"); return(View("Login", model)); } } } // Ready to handle Verification Code if (!string.IsNullOrWhiteSpace(model.VerifyCode)) { var result = await SignInHelper.TwoFactorSignIn("PhoneCode", model.VerifyCode, model.RememberBrowser, false); switch (result) { case SignInStatus.Success: return(RedirectToLocal(returnUrl)); case SignInStatus.UnConfirmed: return(RedirectToAction("EmailNotConfirmed")); // State should not be possible to reach on mobil login accounts case SignInStatus.LockedOut: return(View("Lockout")); case SignInStatus.Failure: default: ModelState.AddModelError("VerifyCode", "Invalid code"); return(View("Login", model)); } } return(View("Login", model)); }