Example #1
0
        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));
        }
Example #2
0
        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());
        }
Example #3
0
        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());
        }