gcogco10 Ответов: 1

Как исправить проблему отсутствия подтверждения от почты?


Привет Команда

У меня есть приложение mvc, использующее индивидуальную учетную запись пользователя, и у меня есть метод регистрации с логином внутри моего контроллера. Пользователи действительно зарегистрированы в таблице базы данных, но выдают im, не получая подтверждения от электронной почты. Любой вопрос о том, почему и да, я до сих пор отлаживал код для обоих этих методов и действительно проходит через оба.

Что я уже пробовал:

<pre> //
        // POST: /Account/Register
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {   
                if(model.Password !=model.ConfirmPassword)
                {
                    TempData["ErrorMessage"] = "New Password must be different from Old Password!!!";
                    ViewBag.JavaScriptFunction = "ShowErrorPopup();";
                    return View(model);
                }
                var user = new ApplicationUser
                {
                    UserName = model.Email,
                    Email = model.Email,
                    FirstName = model.FirstName
                };
                var result = await UserManager.CreateAsync(user, model.Password);
                if(result.Succeeded)
                {
                    string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    await UserManager.SendEmailAsync(user.Id, "Confirm your account", ConfirmAccountMailBody(callbackUrl));

                    model.UserRoles = "PendingUsers";

                    await this.UserManager.AddToRolesAsync(user.Id, model.UserRoles);
                    return View();
                }
                foreach(var error in result.Errors)
                {
                    TempData["ErrorMessage"] = error;
                }
               
            }

            ViewBag.JavaScriptFunction = "ShowErrorPopup();";
            return View(model);
        }


// POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Index(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);

        }

        var emailExist = await UserManager.FindByEmailAsync(model.Email);
        if(emailExist != null)
        {
            if(emailExist.EmailConfirmed == false)
            {
                string code = await UserManager.GenerateEmailConfirmationTokenAsync(emailExist.Id);
                var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = emailExist.Id, code = code }, protocol: Request.Url.Scheme);
                await UserManager.SendEmailAsync(emailExist.Id, "Confirm your account", ConfirmAccountMailBody(callbackUrl));

                TempData["ErrorMessage"] = "Email id is not verified. Please check your email and verify account !!!";
                ViewBag.JavaScriptFunction = "ShowErrorPopup();";
                return View(model);
            }
        }
        else
        {
            TempData["ErrorMessage"] = "Email is not registered !!!";
            ViewBag.JavaScriptFunction = "ShowErrorPopup();";
            return View(model);
        }

        var loggedinUser = await UserManager.FindAsync(model.Email, model.Password);
        if(loggedinUser !=null)
        {
            await UserManager.UpdateSecurityStampAsync(loggedinUser.Id);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                TempData["ErrorMessage"] = "Email or Password is Incorrect";
                ViewBag.JavaScriptFunction = "ShowErrorPopup();";
                return View(model);
        }
    }

1 Ответов

Рейтинг:
2

OriginalGriff

Ты же понимаешь это

await UserManager.SendEmailAsync(emailExist.Id, "Confirm your account", ConfirmAccountMailBody(callbackUrl));
будет ли он только ждать, пока письмо будет отправлено, а не ждать, пока пользователь ответит на него (или даже получит его)?
Если вам нужно подтверждение по электронной почте, вы отправляете его, а затем обрабатываете с подтверждением со страницы, на которую попадает пользователь, когда он нажимает URL-адрес в полученном им письме. Вы не можете просто отправить его и предположить, что пользователь ответит немедленно!