public async Task<IActionResult> ExternalLoginRegister(ExternalLoginRegisterRequest externalLoginRegisterRequest, string returnUrl) { returnUrl = returnUrl ?? Url.Content("~/"); Result<ExternalLoginRegisterViewModel> getViewModelResult = await _accountDataService.GetExternalLoginViewModel(returnUrl); if (getViewModelResult.Failure) { //HACK: change to support list of errors LoginViewModel loginViewModel = await _accountDataService.GetLoginViewModel(returnUrl, getViewModelResult.Errors.FirstOrDefault()?.Message); return View(nameof(Login), loginViewModel); } if (!ModelState.IsValid) { return View(getViewModelResult.Value); } Result result = await _addUserService.ExternalLoginRequest(externalLoginRegisterRequest); if(result.Failure) { getViewModelResult.Value.StatusAlert = StatusAlertViewExtension.Get(result); ModelState.AddErrors(result.Errors); return View(getViewModelResult.Value); } return RedirectToAction(nameof(RegisterSuccess)); }
public async Task <Core.Models.Result.Result> ExternalLoginRequest(ExternalLoginRegisterRequest externalLoginRegisterRequest) { if (!_identityUIEndpoints.RegisterEnabled) { _logger.LogError($"User tried to register, but registrations are disabled"); return(Core.Models.Result.Result.Fail("registration_is_not_enabled", "Registration disabled")); } ValidationResult externalLoginValidationResult = _externalLoginRequsterRequestValidator.Validate(externalLoginRegisterRequest); if (!externalLoginValidationResult.IsValid) { _logger.LogWarning($"Invalid {typeof(ExternalLoginRegisterRequest)} model"); return(Core.Models.Result.Result.Fail(externalLoginValidationResult.Errors)); } ExternalLoginInfo externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync(); if (externalLoginInfo == null) { _logger.LogError($"Failed to get external login info."); return(Core.Models.Result.Result.Fail("failed_to_get_external_login_info", "Failed to get external login info")); } //TODO: do not confirm. don't require confirmed emails for external login users CommonUtils.Result.Result <AppUserEntity> addUserResult = await AddUser( externalLoginRegisterRequest, setPassword : false, sendConfirmationMail : false, emailConfirmed : true); if (addUserResult.Failure) { return(addUserResult.ToOldResult()); } AppUserEntity appUser = addUserResult.Value; IdentityResult addLoginResult = await _userManager.AddLoginAsync(appUser, externalLoginInfo); if (!addLoginResult.Succeeded) { _logger.LogError($"Failed to add login to user. UserId {appUser.Id}"); } return(Core.Models.Result.Result.Ok()); }
public async Task <Result> ExternalLoginRequest(ExternalLoginRegisterRequest externalLoginRegisterRequest) { if (!_identityUIEndpoints.RegisterEnabled) { _logger.LogError($"User tried to register, but registrations are disabled"); return(Result.Fail("registration_is_not_enabled", "Registration disabled")); } ValidationResult externalLoginValidationResult = _externalLoginRequsterRequestValidator.Validate(externalLoginRegisterRequest); ValidationResult userAttributeValidationResult = _userAttributeRequestValidator.Validate(externalLoginRegisterRequest); if (!externalLoginValidationResult.IsValid || !userAttributeValidationResult.IsValid) { _logger.LogWarning($"Invalid {nameof(ExternalLoginRegisterRequestValidator)} model"); List <Result.ResultError> errors = ResultUtils.ToResultError(externalLoginValidationResult.Errors); errors.AddRange(ResultUtils.ToResultError(userAttributeValidationResult.Errors)); return(Result.Fail(errors)); } ExternalLoginInfo externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync(); if (externalLoginInfo == null) { _logger.LogError($"Failed to get external login info."); return(Result.Fail("failed_to_get_external_login_info", "Failed to get external login info")); } List <UserAttributeEntity> userAttributes = null; if (externalLoginRegisterRequest.Attributes != null) { userAttributes = externalLoginRegisterRequest.Attributes .Select(x => new UserAttributeEntity( key: x.Key, value: x.Value)) .ToList(); } string username; if (_identityUIEndpoints.UseEmailAsUsername) { username = externalLoginRegisterRequest.Email; } else { if (string.IsNullOrEmpty(externalLoginRegisterRequest.Username)) { _logger.LogError($"Username cannot be empty"); return(Result.Fail("username_cannot_be_empty", "username_cannot_be_empty")); } username = externalLoginRegisterRequest.Username; } AppUserEntity appUser = new AppUserEntity( userName: username, email: externalLoginRegisterRequest.Email, firstName: externalLoginRegisterRequest.FirstName, lastName: externalLoginRegisterRequest.LastName, emailConfirmed: false, enabled: true, phoneNumber: externalLoginRegisterRequest.PhoneNumber, attributes: userAttributes); IdentityResult createUserResult = await _userManager.CreateAsync(appUser); if (!createUserResult.Succeeded) { _logger.LogError($"Failed to create user"); return(Result.Fail(createUserResult.Errors)); } IdentityResult addLoginResult = await _userManager.AddLoginAsync(appUser, externalLoginInfo); if (!addLoginResult.Succeeded) { _logger.LogError($"Failed to add login to user. UserId {appUser.Id}"); } string code = await _userManager.GenerateEmailConfirmationTokenAsync(appUser); await _emailService.SendVerificationMail(appUser, code); return(Result.Ok()); }