public async Task <IActionResult> Login(LoginViewModel model, string returnUrl = null) { //validate reCaptcha if (_recaptcha.IsEnable) { var resp = this.Request.Form["g-recaptcha-response"].ToString(); var ip = this.HttpContext.Connection.RemoteIpAddress.ToString(); var ok = await ReCAPTCHAValidate.Validate(_recaptcha.Secret, resp, ip); if (!ok) { ModelState.AddModelError(string.Empty, "請先勾選我不是機器人"); return(View(model)); } } ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, set lockoutOnFailure: true var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure : false); if (result.Succeeded) { _logger.LogInformation(1, $"{model.Email} 登入成功 ip={HttpContext.Connection.RemoteIpAddress}"); return(RedirectToLocal(returnUrl)); } if (result.RequiresTwoFactor) { return(RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe })); } if (result.IsLockedOut) { _logger.LogWarning(1, $"{model.Email} 帳戶鎖定 ip={HttpContext.Connection.RemoteIpAddress}"); return(RedirectToAction(nameof(Lockout))); } else { _logger.LogWarning(1, $"{model.Email} 帳號密碼有錯誤 ip={HttpContext.Connection.RemoteIpAddress}"); ModelState.AddModelError(string.Empty, "帳號密碼有錯誤"); return(View(model)); } } // If we got this far, something failed, redisplay form return(View(model)); }
public async Task <IActionResult> ExternalLoginConfirmation(ExternalLoginViewModel model, string returnUrl = null) { //validate reCaptcha if (_recaptcha.IsEnable) { var resp = this.Request.Form["g-recaptcha-response"].ToString(); var ip = this.HttpContext.Connection.RemoteIpAddress.ToString(); var ok = await ReCAPTCHAValidate.Validate(_recaptcha.Secret, resp, ip); if (!ok) { ModelState.AddModelError(string.Empty, "請先勾選我不是機器人"); ViewData["ReturnUrl"] = returnUrl; return(View(nameof(ExternalLogin), model)); } } if (ModelState.IsValid) { // Get the information about the user from the external login provider var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { throw new ApplicationException("Error loading external login information during confirmation."); } //auto delete unconfirmed account var usr1 = await _userManager.FindByNameAsync(model.Email); if (usr1 != null && !usr1.EmailConfirmed) { await _userManager.DeleteAsync(usr1); } var user = new ApplicationUser { UserName = model.Email, Email = model.Email, EX_Name = model.EX_Name, PhoneNumber = model.PhoneNumber }; var result = await _userManager.CreateAsync(user); if (result.Succeeded) { result = await _userManager.AddLoginAsync(user, info); if (result.Succeeded) { var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); result = await _userManager.ConfirmEmailAsync(user, token); if (!result.Succeeded) { throw new Exception("Email Confirm Failure"); } await _signInManager.SignInAsync(user, isPersistent : false); _logger.LogInformation(6, $"帳號-{user.UserName}透過{info.LoginProvider}驗證註冊成功,並登入。 "); return(RedirectToLocal(returnUrl)); } } AddErrors(result); } ViewData["ReturnUrl"] = returnUrl; return(View(nameof(ExternalLogin), model)); }
public async Task <IActionResult> Register(RegisterViewModel model, string returnUrl = null) { //validate reCaptcha if (_recaptcha.IsEnable) { var resp = this.Request.Form["g-recaptcha-response"].ToString(); var ip = this.HttpContext.Connection.RemoteIpAddress.ToString(); var ok = await ReCAPTCHAValidate.Validate(_recaptcha.Secret, resp, ip); if (!ok) { ModelState.AddModelError(string.Empty, "請先勾選我不是機器人"); return(View(model)); } } ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email, EX_Name = model.EX_Name, PhoneNumber = model.PhoneNumber }; //auto delete unconfirmed account var usr1 = await _userManager.FindByNameAsync(model.Email); if (usr1 != null && !usr1.EmailConfirmed) { await _userManager.DeleteAsync(usr1); } var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { //需要Email Confirm if (_identityOpt.SignIn.RequireConfirmedEmail) { _logger.LogInformation("User created a new account with password."); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); var callbackUrl = Url.EmailConfirmationLink(user.Id.ToString(), code, Request.Scheme); await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl, user); model.IsEmailSend = true; model.StatusMessage = $"驗證信已寄送至{model.Email},請收信後繼續完成註冊程序。"; } else { await _signInManager.SignInAsync(user, isPersistent : false); _logger.LogInformation(3, $"註冊帳號 {user.UserName} ip={HttpContext.Connection.RemoteIpAddress}"); return(RedirectToLocal(returnUrl)); } } AddErrors(result); } // If we got this far, something failed, redisplay form return(View(model)); }