我注册用户,通过电子邮件接收令牌,如下所示:
Please confirm your account by clicking <a href="http://localhost:11080/Account/ConfirmEmail?userId=51d95921-c240-4025-ac38-7dfc08a1012f&code=Jc58CjzNK6mkeaFT0U7iO68aKP4OrQtYWY9AWCkJtWpnc948kiR%2Bxq9PnptItf1kpKjgi0OyZdguBwCvePOQ%2Bf5P3IPTZwdVA%2FEJ%2F6A9iscTKjDcR2Q9bJH%2FH76S5h1W0lsSSLxfad2Bjrr4H%2BySgP70uktmZIUkhQXnIJN1%2BqBuJ9EfWeuytOfbv1i%2FkNtV">here</a>
点击该链接,我可以看到ConfirmEmail
中的AccountController
方法触发:
[AllowAnonymous]
public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
if (userId == null || code == null)
{
return View("Error");
}
var result = await UserManager.ConfirmEmailAsync(userId, code);
return View(result.Succeeded ? "ConfirmEmail" : "Error");
}
而result.Succeeded
是true
。
一切似乎都很好,但在完成此过程后尝试登录时,我会转到该页面,告诉我我的帐户已被锁定
锁定。
此帐户已被锁定,请稍后再试。
我可能做错了什么?我是否需要手动更改数据库中的锁定标志?如果是这样,那么ConfirmEmailAsync
方法有什么意义呢?
答案 0 :(得分:1)
ConfirmEmailAsync
只需将用户帐户记录中的EmailConfirmed
设置为true即可。从UserManager(为简洁起见编辑):
public virtual async Task<IdentityResult> ConfirmEmailAsync(TUser user, string token)
{
...
var store = GetEmailStore();
...
await store.SetEmailConfirmedAsync(user, true, CancellationToken);
return await UpdateUserAsync(user);
}
GetEmailStore
返回IUserEmailStore
的位置(默认情况下由UserStore
执行),sets the flag:
public virtual Task SetEmailConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
...
user.EmailConfirmed = confirmed;
return Task.CompletedTask;
}
您收到的错误表明用户帐户上的LockoutEnabled
标记为true。您可以通过调用SetLockoutEnabledAsync
上的UserManager
方法将其设置为false。
SupportsUserLockout
上还有一个UserManager
标记,默认情况下会在创建时解锁帐户。要设置此项,您需要创建自己的UserManager
并将此标记覆盖为false。
答案 1 :(得分:1)
起初,我面临着使这些方法工作的挑战,经过一系列研究后没有成功。最终,我找到了问题的根源并加以解决,从而分享了我的经验。请按照以下过程操作,我相信它会有所帮助。
步骤1 转到Startup.cs并删除以下代码(如果已初始化);
services.Configure<RouteOptions>(options =>
{
options.LowercaseUrls = true;
//options.LowercaseQueryStrings = true; //(comment or remove this line)
});
GenerateEmailConfirmationTokenAsync()/ ConfirmEmailAsync()的步骤2 2a。在注册新用户以生成令牌时,照常进行;
var originalCode = await userManager.GenerateEmailConfirmationTokenAsync(user);
var code = HttpUtility.UrlEncode(originalCode);
var confirmationLink = Url.Action("ConfirmEmail", "Account",
new { userId = user.Id, token = code }, Request.Scheme);
2b。收到用于电子邮件确认的confrimationLink后,照此进行
var originalCode = HttpUtility.UrlDecode(token);
var result = await userManager.ConfirmEmailAsync(user, originalCode);
if (result.Succeeded)
{
return View(); //this returns login page if successful
}
对于GeneratePasswordResetTokenAsync()
和ResetPasswordAsync()
a。
var originalCode = await userManager.GeneratePasswordResetTokenAsync(user);
var code = HttpUtility.UrlEncode(originalCode);
var passwordResetLink = Url.Action("ResetPassword", "Account",
new { email = model.Email, token = code }, Request.Scheme);
b。
var orginalCode = HttpUtility.UrlDecode(model.Token);
var result = await userManager.ResetPasswordAsync(user, orginalCode, model.Password);
if (result.Succeeded)
{
return View("ResetPasswordConfirmation");
}