【问题标题】:Email token expired and "Email already taken" issue - Asp.net Identity 2.0 API电子邮件令牌已过期和“电子邮件已被占用”问题 - Asp.net Identity 2.0 API
【发布时间】:2017-02-15 00:05:27
【问题描述】:

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

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

但 3 小时后,如果我尝试确认电子邮件地址,则会收到“Invalid Token”错误。

如果用户再次尝试注册,他会收到“电子邮件/姓名已被占用”错误。

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

有人可以帮忙吗?

【问题讨论】:

  • @GauravKP 那里的问题完全不同。操作员在那里询问如何更改到期时间,我在问如何避免用户无法注册也无法注册的情况,因为他已经在系统中,但没有确认他的电子邮件,因为它已过期。
  • 要处理这种死锁,您必须选择重新发送确认链接(如果电子邮件和密码已验证),并带有新令牌。正如您所提到的,您可以更改到期时间,但我们不应将其设置得太长。另请注意,实时发送电子邮件也可能失败
  • 为什么不生成新的令牌并重新发送电子邮件?
  • @tmg 我认为这是个好主意,但我不确定当用户到达过期链接时我会在什么时候这样做?我也不知道该怎么做。

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


【解决方案1】:

您可以在很多地方执行此操作。假设您正在执行以下操作来注册用户

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);
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2015-01-06
    相关资源
    最近更新 更多