核心2身份 - 重新生成EmailConfirmationLink

时间:2018-03-30 20:34:43

标签: c# asp.net-core asp.net-identity asp.net-core-2.0

我在Core 2应用程序中有一个相当标准的Identity实现。

我已启用了确认电子邮件的要求。这一切都运作良好 - 它生成并发送电子邮件,其中包含有效链接,点击后会确认用户的帐户。没问题。

情况是,如果电子邮件丢失/被删除/永远不会出于任何原因到达。

我正在做的是使用标准登录方法,如果是IsNotAllowed,我会将它们推向一个页面,告诉他们需要激活他们的帐户,检查他们的电子邮件等。

在该页面上,我有一个带有按钮的表单,该按钮发布到控制器以重新生成并重新发送电子邮件。

我将标准Register方法中的代码复制并粘贴到我的自定义方法中。

问题是单击链接时激活失败。我收到InvalidToken错误。

任何想法为什么以及如何解决?

登录方式

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(model.Email,
            model.Password, model.RememberMe, lockoutOnFailure : false);

        if (result.IsNotAllowed)
        {
            var user = await _userManager.FindByEmailAsync(model.Email);

            EmailConfirmationViewModel viewModel = new EmailConfirmationViewModel();
            viewModel.Email = model.Email;

            return RedirectToAction("AwaitingEmailConfirmation", viewModel);
        }
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return RedirectToAction("Index", "Races");
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToAction(nameof(Lockout));
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return View(model);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

注册方法

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser
        {
            UserName = model.Email,
            Email = model.Email,
            FirstName = model.FirstName,
            LastName = model.LastName,
            MobileNumber = model.MobileNumber,
            Marketing = model.Marketing,
            Newsletter = model.Newsletter,
            Source = "Website"
        };
        var result = await _userManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.EmailConfirmationLink(user.Id, code, Request.Scheme);
            await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);

            //await _createContact.CreateContactAsync(model.Email, model.FirstName, 
            //model.LastName, model.Marketing, model.Newsletter);
            var fields = new Dictionary<string, string>();
            fields.Add("firstname", model.FirstName);
            fields.Add("lastname", model.LastName);
            fields.Add("newsletter", model.Newsletter.ToString());
            fields.Add("marketing", model.Marketing.ToString());
            fields.Add("source", "Website");
            string publicaccountid = "55ebcc8b-b23f-4843-9dcb-1df08811de65";
            var createcontact = ElasticEmailClient.Api.Contact.AddAsync(publicAccountID: publicaccountid,
                email : model.Email, field : fields, sendActivation : false);

            //await _signInManager.SignInAsync(user, isPersistent: false);
            _logger.LogInformation("User created a new account with password.");

            EmailConfirmationViewModel viewModel = new EmailConfirmationViewModel();
            viewModel.Email = user.Email;
            return RedirectToAction("AwaitingEmailConfirmation", viewModel);
        }
        AddErrors(result);
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

重新发送电子邮件方式

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> ResendConfirmationEmail(EmailConfirmationViewModel model)
{

    var user = await _userManager.FindByEmailAsync(model.Email);
    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
    var callbackUrl = Url.EmailConfirmationLink(user.Id, code, Request.Scheme);
    await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);

    return RedirectToAction("AwaitingEmailConfirmation", model);
}

0 个答案:

没有答案