Search code examples
asp.net-identity

Asp MVC Core Identity Email Confirmation


anyone can help me on this issue,
In ASP.net Core identity, I try to create Account Creation by email confirmation by following this code it always shows invalid token while confirming a token, I also searched all related answers none of them helped me

enter code here

      public async Task<IActionResult> RegisterUser(RegisterViewModel registerModel)
    {

        if (Request.Method=="POST")
        {
            if (ModelState.IsValid)
            {
                ErrorModals er = new ErrorModals();
                var userName = _userManager.FindByEmailAsync(registerModel.EmailAddress).Result;

                if (userName == null)
                {
                    var userDetails = new ApplicationUser {UserName= registerModel.FirstName, Email=registerModel.EmailAddress };
                    var dd = await _userManager.CreateAsync(new ApplicationUser()
                    {
                        UserName = (registerModel.FirstName).Trim(),
                        Email = (registerModel.EmailAddress).Trim(),

                    }, registerModel.Password);

                    var tokenCode = await _signManager.UserManager.GenerateEmailConfirmationTokenAsync(userDetails);               

                    var res = _signManager.UserManager.ConfirmEmailAsync(userDetails, tokenCode).Result;

                    tokenCode = System.Web.HttpUtility.UrlEncode(tokenCode);
                    userName = _userManager.FindByEmailAsync(registerModel.EmailAddress).Result;                 
                var callBackUrl = Url.Action("ConfirmEmail", "Account", new { userId=userName.Id,code=tokenCode}, protocol: HttpContext.Request.Scheme);
                    MailModel mailModel = new MailModel();
                    EmailProcess emailProcess = new EmailProcess();
                    mailModel.Email = registerModel.EmailAddress;
                    mailModel.Subject = "Email Confirmation";
                    await emailProcess.SendMailAsync(mailModel, callBackUrl);                     
                   return RedirectToAction("Login", "Account", "");
                }
                else
                {

                    er.ErrorMessage = "Email  Already Registerd.";
                    er.LinkMessage = "Click To Register Again";
                    er.Action = "Account";
                    er.Controller = "createuser";
                  //  ModelState.AddModelError(string.Empty, "Email  Already Registerd.");
                    return View("views/Shared/ErrorModal.cshtml",er);
                }

            }
            return View("views/userauthenticate/register.cshtml");
        }

       ModelState.Clear();
        return View("views/userauthenticate/register.cshtml");

    }

 public async Task <IActionResult> ConfirmEmail(string userId, string code)
    {
             ErrorModals models = new ErrorModals();
        var encodedCode = System.Net.WebUtility.UrlDecode(code);  
        var userDetails = _signInManager.UserManager.FindByIdAsync(userId).Result;           
        var response = await _signInManager.UserManager.ConfirmEmailAsync(userDetails, encodedCode); 

It always shows invalid token while validate here return View("views/Shared/ErrorModal.cshtml"); }


Solution

  • Yes I got the Answer it's due to Security Stamp is null while creating user ,

     var userDetails = new ApplicationUser { UserName = (registerModel.FirstName).Trim(), Email = (registerModel.EmailAddress).Trim() };
                        var isCreateUser = await _userManager.CreateAsync(userDetails, registerModel.Password);