public IActionResult ExternalLogin(string provider, string returnUrl, string timeZone, AuthPageType pageType = AuthPageType.Login) { var redirectUrl = Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl, TimeZone = timeZone, PageType = pageType }); var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); return(new ChallengeResult(provider, properties)); }
public async Task <IActionResult> ExternalLoginCallback(string timeZone, AuthPageType pageType = AuthPageType.Login, string returnUrl = null, string remoteError = null) { var view = new ViewResult(); var field = string.Empty; switch (pageType) { case AuthPageType.Login: returnUrl = returnUrl ?? Url.Content("~/"); view = View("Login", new LoginViewModel { ReturnUrl = returnUrl, ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList() }); field = nameof(LoginViewModel.Email); break; case AuthPageType.Register: returnUrl = Url.Action(nameof(StartController.Index), "Start"); field = nameof(RegisterViewModel.Email); view = View("Register", new RegisterViewModel() { ReturnUrl = returnUrl, ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(), TimeZoneList = ToolsExtensions.GetTimeZones() }); break; } if (remoteError != null) { ModelState.AddModelError(field, Constants.AuthProviderError); _logger.LogError($"{Constants.AuthProviderKnownError}: {remoteError}"); return(view); } var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { ModelState.AddModelError(field, Constants.AuthProviderError); _logger.LogError(Constants.AuthProviderUnknownError); return(view); } var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false, true); if (result.Succeeded) { return(LocalRedirect(returnUrl)); } var email = info.Principal.FindFirstValue(ClaimTypes.Email); if (email == null) { ModelState.AddModelError(field, Constants.AuthProviderError); _logger.LogError(Constants.AuthProviderUnknownEmailError); return(view); } var user = await _userManager.FindByEmailAsync(email); if (user == null) { user = new AppUser { UserName = info.Principal.FindFirstValue(ClaimTypes.Email), Email = info.Principal.FindFirstValue(ClaimTypes.Email), TimeZone = timeZone ?? ToolsExtensions.GetTimeZones().FirstOrDefault().Key }; var resultCreate = await _userManager.CreateAsync(user); if (resultCreate.Succeeded) { var appLink = Url.Action(nameof(Login), "Account", null, HttpContext.Request.Scheme); var response = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails { IsHTML = true, ToEmail = user.Email, Subject = Constants.SubjectRegistrationEmail }, Constants.TitleRegistrationEmail, Constants.ContentRegistrationEmail, Constants.ButtonVisitSide, appLink); if (!response.Successful) { TempData["ErrorMessage"] = Constants.GeneralSendEmailErrorMessage; foreach (var error in response.Errors) { _logger.LogError(error); } } } } await _userManager.AddLoginAsync(user, info); await _signInManager.SignInAsync(user, false); return(LocalRedirect(returnUrl)); }