电子邮件令牌已过期和 "Email already taken" 问题 - Asp.net Identity 2.0 API
Email token expired and "Email already taken" issue - Asp.net Identity 2.0 API
我在 Asp.Net Identity API 2.0 中遇到了一个奇怪的问题。
当用户注册时,我向用户发送一封确认邮件,如果用户在注册后 3 小时内确认他/她的帐户,"ConfirmEmailAsync" 方法似乎有效。
但是 3 小时后,如果我尝试确认电子邮件地址,我会收到 "Invalid Token" 错误。
然后,如果用户尝试再次注册,他会收到 "Email/Name is already taken" 错误。
我该如何解决用户出现 "locked",他无法登录,也无法从头开始注册的情况。
有人可以帮忙吗?
你可以在很多地方做this.Say你正在做类似下面的事情来注册用户
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);
}
希望这对您有所帮助。
我在 Asp.Net Identity API 2.0 中遇到了一个奇怪的问题。
当用户注册时,我向用户发送一封确认邮件,如果用户在注册后 3 小时内确认他/她的帐户,"ConfirmEmailAsync" 方法似乎有效。
但是 3 小时后,如果我尝试确认电子邮件地址,我会收到 "Invalid Token" 错误。
然后,如果用户尝试再次注册,他会收到 "Email/Name is already taken" 错误。
我该如何解决用户出现 "locked",他无法登录,也无法从头开始注册的情况。
有人可以帮忙吗?
你可以在很多地方做this.Say你正在做类似下面的事情来注册用户
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);
}
希望这对您有所帮助。