Пример #1
0
        public IActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                bool thereIsNoSuchEmailYet = context.EmailLoginInfo
                                             .FirstOrDefault(a => a.Email == model.Email) == null;

                if (thereIsNoSuchEmailYet)
                {
                    //Отправка сообщения на указанный email, чтобы удостовериться, что он принадлежит этому пользователю
                    if (EmailMessageSender.EmailIsValid(model.Email))
                    {
                        Guid guid = Guid.NewGuid();
                        var  link = GetEmailConfirmationLink(model, guid);

                        bool sendIsOk = emailSender.SendEmailCheck(model.Email, model.Name, link);

                        if (sendIsOk)
                        {
                            var tmpAccount = new TemporaryAccountWithUsernameAndPassword()
                            {
                                Name             = model.Name,
                                Password         = model.Password,
                                Email            = model.Email,
                                RegistrationDate = DateTime.UtcNow,
                                Guid             = guid
                            };

                            context.TemporaryAccountWithUsernameAndPassword.Add(tmpAccount);
                            context.SaveChanges();
                        }
                    }
                    return(RedirectToAction("MyBots", "MyBots"));
                }
                else
                {
                    ModelState.AddModelError("", "Аккаунт с таким email уже существует");
                }
            }
            return(View(model));
        }
        public IActionResult PasswordResetEnterEmail(string email)
        {
            if (!EmailMessageSender.EmailIsValid(email))
            {
                ModelState.AddModelError("", "Введённый email неверный");
                return(View());
            }

            Account account = context.EmailLoginInfo
                              .Include(info => info.Account)
                              .SingleOrDefault(_acc => _acc.Email == email)?.Account;

            if (account != null)
            {
                //Отправка сообщения

                Guid guid = Guid.NewGuid();

                AccountToResetPassword tmpRecordDb = new AccountToResetPassword()
                {
                    AccountId = account.Id, GuidPasswordSentToEmail = guid
                };

                //TODO Перезаписывать запрос на смену пароля если уже он уже есть
                List <AccountToResetPassword> recordsWithTheSameAccountId = context.AccountsToResetPassword
                                                                            .Where(_tmpRecord => _tmpRecord.AccountId == account.Id)
                                                                            .ToList();

                if (!recordsWithTheSameAccountId.Any())
                {
                    context.AccountsToResetPassword.Add(tmpRecordDb);
                }
                else if (recordsWithTheSameAccountId.Count() == 1)
                {
                    recordsWithTheSameAccountId[0].GuidPasswordSentToEmail = guid;
                }
                else
                {
                    throw new Exception("В базе не должно быть больше одной записи для смены пароля");
                }

                string domain = domainNameService.GetDomainName();
                var    link   = $"https://{domain}/PasswordReset/PasswordResetOnlyNewPass?guid={guid.ToString()}&accountId={account.Id}";


                bool sendIsOk = emailSender.SendPasswordReset(email, account.Name, link);


                if (!sendIsOk)
                {
                    //если email не отправился, то удалить из БД запись о возможности сброса пароля
                    context.AccountsToResetPassword.Remove(tmpRecordDb);
                }
                context.SaveChanges();

                string message = "На вашу почту отправлено письмо. Для того, чтобы сбросить пароль следуйте инструкциям в письме. ";
                return(RedirectToAction("Success", "StaticMessage", new { message }));
            }
            else
            {
                ModelState.AddModelError("", "Аккаунта с таким email не существует.");
            }

            return(View());
        }