public async Task <IActionResult> RegisterGroup(RegisterGroupModel registerGroupModel)
        {
            if (!_identityUIEndpoints.GroupRegistrationEnabled)
            {
                return(NotFound());
            }

            if (!ModelState.IsValid)
            {
                RegisterGroupViewModel registerViewModel = _accountDataService.GetRegisterGroupViewModel();

                return(View(registerViewModel));
            }

            CommonUtils.Result.Result result = await _groupRegistrationService.Add(registerGroupModel);

            if (result.Failure)
            {
                RegisterGroupViewModel registerViewModel = _accountDataService.GetRegisterGroupViewModel();

                CommonUtils.Result.ResultExtensions.AddResultErrors(ModelState, result);
                return(View(registerViewModel));
            }

            return(RedirectToAction(nameof(RegisterSuccess)));
        }
Beispiel #2
0
        public async Task <Core.Models.Result.Result> Register(RegisterRequest registerRequest)
        {
            if (!_identityUIEndpoints.RegisterEnabled)
            {
                _logger.LogError($"User tried to register, but registrations are disabled");
                return(Core.Models.Result.Result.Fail(REGISTRATION_IS_NOT_ENABLED, REGISTRATION_IS_NOT_ENABLED));
            }

            ValidationResult validationResult = _registerValidator.Validate(registerRequest);

            if (!validationResult.IsValid)
            {
                _logger.LogWarning($"Invalid {typeof(RegisterRequest).Name}");
                return(Core.Models.Result.Result.Fail(validationResult.Errors));
            }

            CommonUtils.Result.Result <AppUserEntity> addResult = await AddUser(registerRequest);

            if (addResult.Failure)
            {
                return(Core.Models.Result.Result.Fail(addResult.ResultMessages.Select(x => new Core.Models.Result.Result.ResultError(x.Code, x.Code, null)).ToList()));
            }

            return(Core.Models.Result.Result.Ok());
        }
        public async Task <Result <SignInResult> > Callback(string remoteError)
        {
            if (!string.IsNullOrEmpty(remoteError))
            {
                _logger.LogError($"External login provider returned error. Error {remoteError}");
                return(Result.Fail <SignInResult>("external_login_provider_error", remoteError));
            }

            ExternalLoginInfo externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync();

            if (externalLoginInfo == null)
            {
                _logger.LogError($"Error getting external login info");
                return(Result.Fail <SignInResult>("failed_to_get_external_longin_info", "Failed to get external login info"));
            }

            AppUserEntity appUser = await _userManager.FindByLoginAsync(externalLoginInfo.LoginProvider, externalLoginInfo.ProviderKey);

            if (appUser == null)
            {
                _logger.LogInformation($"Users email does not exist");
                return(Result.Ok(SignInResult.Failed));
            }

            string sessionCode = _identityUIUserInfoService.GetSessionCode();

            if (sessionCode != null)
            {
                _sessionService.Logout(sessionCode, appUser.Id, SessionEndTypes.Expired);
            }

            CommonUtils.Result.Result beforeLoginFilterResult = await _canLoginService.BeforeAdd(appUser);

            if (beforeLoginFilterResult.Failure)
            {
                _logger.LogInformation($"User is not allowed to login. User {appUser.Id}");
                beforeLoginFilterResult.ToOldResult();
            }

            SignInResult signInResult = await _signInManager.ExternalLoginSignInAsync(
                loginProvider : externalLoginInfo.LoginProvider,
                providerKey : externalLoginInfo.ProviderKey,
                isPersistent : false,
                bypassTwoFactor : _identityUIEndpoints.BypassTwoFactorOnExternalLogin);

            CommonUtils.Result.Result afterLoginFilterResult = await _canLoginService.AfterAdded(appUser);

            if (afterLoginFilterResult.Failure)
            {
                await _signInManager.SignOutAsync();

                _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.AffterLoginFilterFailure);

                _logger.LogInformation($"User is not allowed to login. User {appUser.Id}");
                afterLoginFilterResult.ToOldResult();
            }

            return(Result.Ok(signInResult));
        }
        public async Task <IActionResult> Remove([FromRoute] string groupId, [FromRoute] string inviteId)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            CommonUtils.Result.Result result = await _inviteService.Remove(groupId, inviteId);

            return(result.ToApiResult());
        }
Beispiel #5
0
        /// <summary>
        /// Used to login user after password change, 2fa change
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="sessionCode"></param>
        /// <param name="ip"></param>
        /// <returns></returns>
        public async Task <Result> Login(string userId, string sessionCode, string ip)
        {
            await _signInManager.SignOutAsync();

            AppUserEntity appUser = await _userManager.FindByIdAsync(userId);

            if (appUser == null)
            {
                _logger.LogInformation($"No user with username {userId}");
                return(Result.Fail("error", "Error"));
            }

            if (sessionCode != null)
            {
                _sessionService.Logout(sessionCode, appUser.Id, SessionEndTypes.SecurityCodeChange);
            }

            CommonUtils.Result.Result canLoginResult = await _canLoginService.BeforeAdd(appUser);

            if (canLoginResult.Failure)
            {
                _logger.LogInformation($"User is not allowd to login. User {appUser.Id}");
                return(Result.Fail("error", "Error"));
            }

            appUser.SessionCode = Guid.NewGuid().ToString();

            Result addSessionResult = _sessionService.Add(appUser.SessionCode, appUser.Id, ip);

            if (addSessionResult.Failure)
            {
                return(Result.Fail("error", "error"));
            }

            await _signInManager.SignInAsync(appUser, false);

            CommonUtils.Result.Result afterLoginFilterResult = await _canLoginService.AfterAdded(appUser);

            if (afterLoginFilterResult.Failure)
            {
                await _signInManager.SignOutAsync();

                _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.AffterLoginFilterFailure);

                return(Result.Fail("error", "error"));
            }

            _logger.LogInformation($"User loged in. UserId {appUser.Id}");

            return(Result.Ok());
        }
Beispiel #6
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());
        }
Beispiel #7
0
        public async Task <CommonUtils.Result.Result> EditUser(long groupUserId, EditUserRequest editUserRequest)
        {
            IBaseSpecification <GroupUserEntity, GroupUserEntity> specification = SpecificationBuilder
                                                                                  .Create <GroupUserEntity>()
                                                                                  .Where(x => x.Id == groupUserId)
                                                                                  .Include(x => x.User)
                                                                                  .Build();

            CommonUtils.Result.Result <GroupUserEntity> getGroupUserResult = await _groupUserStore.SingleOrDefault(specification);

            if (getGroupUserResult.Failure)
            {
                return(CommonUtils.Result.Result.Fail(getGroupUserResult));
            }

            //TODO: change so that Edit takes AppUserEntity as parameter
            Core.Models.Result.Result updateResult = await EditUser(getGroupUserResult.Value.UserId, editUserRequest, "");

            return(updateResult.ToNewResult());
        }
Beispiel #8
0
        public async Task <CommonUtils.Result.Result> SendEmilVerificationMail(long groupUserId)
        {
            IBaseSpecification <GroupUserEntity, GroupUserEntity> specification = SpecificationBuilder
                                                                                  .Create <GroupUserEntity>()
                                                                                  .Where(x => x.Id == groupUserId)
                                                                                  .Include(x => x.User)
                                                                                  .Build();

            CommonUtils.Result.Result <GroupUserEntity> getGroupUserResult = await _groupUserStore.SingleOrDefault(specification);

            if (getGroupUserResult.Failure)
            {
                return(CommonUtils.Result.Result.Fail(getGroupUserResult));
            }

            SendEmailVerificationMailRequest sendEmailVerificationMailRequest = new SendEmailVerificationMailRequest(
                userId: getGroupUserResult.Value.UserId);

            Core.Models.Result.Result result = await SendEmilVerificationMail(sendEmailVerificationMailRequest, "");

            return(result.ToNewResult());
        }
Beispiel #9
0
        public async Task <IActionResult> Delete([FromRoute] string userId)
        {
            CommonUtils.Result.Result result = await _manageUserService.RemoveUser(userId);

            return(CommonUtils.Result.ActionResultExtensions.ToApiResult(result));
        }
Beispiel #10
0
        public async Task <SignInResult> Login(string ip, string sessionCode, LoginRequest login)
        {
            ValidationResult validationResult = _loginValidator.Validate(login);

            if (!validationResult.IsValid)
            {
                _logger.LogError($"Invalid LoginRequest. UserName {login?.UserName}");
                return(SignInResult.Failed);
            }

            await _signInManager.SignOutAsync();

            AppUserEntity appUser = await _userManager.FindByNameAsync(login.UserName);

            if (appUser == null)
            {
                _logger.LogInformation($"No user with username {login.UserName}");
                return(SignInResult.Failed);
            }

            if (sessionCode != null)
            {
                _sessionService.Logout(sessionCode, appUser.Id, SessionEndTypes.Expired);
            }

            CommonUtils.Result.Result beforeLoginfilterResult = await _canLoginService.BeforeAdd(appUser);

            if (beforeLoginfilterResult.Failure)
            {
                _logger.LogInformation($"User is not allowed to login. User {appUser.Id}");
                return(SignInResult.Failed);
            }

            appUser.SessionCode = Guid.NewGuid().ToString();

            Result addSessionResult = _sessionService.Add(appUser.SessionCode, appUser.Id, ip);

            if (addSessionResult.Failure)
            {
                return(SignInResult.Failed);
            }

            SignInResult result = await _signInManager.PasswordSignInAsync(appUser, login.Password, login.RememberMe, lockoutOnFailure : true);

            if (!result.Succeeded)
            {
                if (result.RequiresTwoFactor)
                {
                    _logger.LogInformation($"Login Requires TwoFactor. User {appUser.Id}");
                    _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.TwoFactorLogin);
                }

                if (!result.IsLockedOut)
                {
                    _logger.LogInformation($"Failed to log in user. User {appUser.Id}");
                    _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.InvalidLogin);
                }

                return(result);
            }

            CommonUtils.Result.Result afterLoginFilterResult = await _canLoginService.AfterAdded(appUser);

            if (afterLoginFilterResult.Failure)
            {
                await _signInManager.SignOutAsync();

                _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.AffterLoginFilterFailure);

                return(SignInResult.Failed);
            }

            _logger.LogInformation($"User id logged in. UserId {appUser.Id}");

            return(result);
        }
Beispiel #11
0
        public async Task <SignInResult> LoginWith2fa(string ip, LoginWith2faRequest loginWith2FaRequest)
        {
            ValidationResult validationResult = _lginwith2faValidator.Validate(loginWith2FaRequest);

            if (!validationResult.IsValid)
            {
                _logger.LogError($"Invalid LoginWith2faRequest");
                return(SignInResult.Failed);
            }

            string code = loginWith2FaRequest.Code.Replace(" ", string.Empty).Replace("-", string.Empty);

            AppUserEntity appUser = await _signInManager.GetTwoFactorAuthenticationUserAsync();

            if (appUser == null)
            {
                _logger.LogError($"No user for Twofactor login");
                return(SignInResult.Failed);
            }

            CommonUtils.Result.Result canLoginResult = await _canLoginService.BeforeAdd(appUser);

            if (canLoginResult.Failure)
            {
                _logger.LogInformation($"User is not allowd to login. User {appUser.Id}");
                return(SignInResult.Failed);
            }

            if (!appUser.TwoFactorEnabled || appUser.TwoFactor == TwoFactorAuthenticationType.None)
            {
                _logger.LogError($"Use does not have 2fa enabled. User {appUser.Id}");
                return(SignInResult.Failed);
            }

            appUser.SessionCode = Guid.NewGuid().ToString();

            Result addSessionResult = _sessionService.Add(appUser.SessionCode, appUser.Id, ip);

            if (addSessionResult.Failure)
            {
                return(SignInResult.Failed);
            }

            SignInResult signInResult = await _signInManager.TwoFactorSignInAsync(appUser.TwoFactor.ToProvider(), code,
                                                                                  loginWith2FaRequest.RememberMe, loginWith2FaRequest.RememberMachine);

            if (!signInResult.Succeeded)
            {
                _logger.LogError($"Faild to log in user with TwoFactorAuthenticator");
                _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.InvlidTwoFactorLogin);
            }

            CommonUtils.Result.Result afterLoginFilterResult = await _canLoginService.AfterAdded(appUser);

            if (afterLoginFilterResult.Failure)
            {
                await _signInManager.SignOutAsync();

                _sessionService.Logout(appUser.SessionCode, appUser.Id, SessionEndTypes.AffterLoginFilterFailure);

                return(SignInResult.Failed);
            }

            _logger.LogInformation($"User logged in with 2fa. UserId {appUser.Id}");

            return(signInResult);
        }