电子邮件令牌已过期且“已发送电子邮件”问题 - Asp.net Identity 2.0 API

时间:2016-10-06 09:45:12

标签: asp.net asp.net-identity-2

我在Asp.Net Identity API 2.0中遇到了一个奇怪的问题。

当用户注册时,我会向用户发送确认电子邮件,如果用户在注册后3小时内确认了他/她的帐户,则“ConfirmEmailAsync”方法似乎正在运行。

但是3小时后,如果我尝试确认电子邮件地址,我会收到“无效令牌”错误。

然后,如果用户再次尝试注册,则会收到“已发送电子邮件/名称”错误。

如何解决用户被“锁定”的情况,他无法登录,也无法从头开始注册。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以在各种地方执行此操作。您正在执行以下操作来注册用户

var user = new ApplicationUser { UserName = model.RegisterEmail.ToLower(), Email = model.RegisterEmail.ToLower(), PhoneNumber = model.RegisterPhoneNumber, EmailConfirmed = true, PhoneNumberConfirmed = true };
var addUserResult = await UserManager.CreateAsync(user, model.RegisterPassword);


if (!addUserResult.Succeeded)
{
    ApplicationUser user = await UserManager.FindByEmailAsync(model.RegisterEmail.ToLower());
    if(!user.EmailConfirmed)
    {
       var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
       //Send the new link
       //return the error message accordingly.
    }       
}

您可以在登录期间执行相同操作

ApplicationUser user = await UserManager.FindAsync(model.UserName.ToLower(), model.Password);   
if(user != null && !user.EmailConfirmed)
{
       var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
    //Send the new link
    //return the error message accordingly.
}

或者如果您使用的是SigninManager(这是来自默认的MVC模板)

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:
        //redirecting to a different page
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
    case SignInStatus.Failure:
    default:
        ModelState.AddModelError("", "Invalid login attempt.");
        return View(model);
}

希望这会有所帮助。