使用 UserManager 更改用户的电子邮件

Posted

技术标签:

【中文标题】使用 UserManager 更改用户的电子邮件【英文标题】:Using UserManager to change the email of a user 【发布时间】:2022-01-11 18:46:46 【问题描述】:

我正在尝试实施一项功能来更改用户的电子邮件。默认情况下,Asp 网络核心身份允许用户更改电子邮件,但它需要确认链接。我想知道是否可以不使用确认链接而只编辑功能以使用新电子邮件更新用户的电子邮件。提前致谢

我试过了

 await _userManager.ChangeEmailAsync(user, Input.NewEmail, code);

var changingser = _userManager.Users.First(u => u.Email.Equals(email));
changingser.Email = Input.NewEmail;

这似乎不起作用

Email.cshtml:更改电子邮件功能

    public async Task<IActionResult> OnPostChangeEmailAsync()
    
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        
            return NotFound($"Unable to load user with ID '_userManager.GetUserId(User)'.");
        

        if (!ModelState.IsValid)
        
            await LoadAsync(user);
            return Page();
        

        var email = await _userManager.GetEmailAsync(user);
        if (Input.NewEmail != email)
        
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateChangeEmailTokenAsync(user, Input.NewEmail);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

            await _userManager.ChangeEmailAsync(user, Input.NewEmail, code);

/*                var callbackUrl = Url.Page(
                    "/Account/ConfirmEmailChange",
                    pageHandler: null,
                    values: new  userId = userId, email = Input.NewEmail, code = code ,
                    protocol: Request.Scheme);*/

                //await _emailSender.SendEmailAsync(
                //    Input.NewEmail,
                //    "Confirm your email",
                //    $"Please confirm your account by <a href='HtmlEncoder.Default.Encode(callbackUrl)'>clicking here</a>.");

            StatusMessage = "Email has been changed";
            return RedirectToPage();
        

        StatusMessage = "Your email is unchanged.";
        return RedirectToPage();
    

编辑:无效令牌失败?

【问题讨论】:

后者由于密码散列而无法工作。您必须使用 usermanager 类 感谢您的回复。我正在尝试使用 userManager 类并执行 .ChangeEmailAsycn 但它似乎没有保存更改 看看你的回报是多少。从 await _userManager.ChangeEmailAsync 调用中获取 IdentityResult(即:var result = _userManager.ChangeEmailAsync()) @GHDevOps 由于某种原因,我似乎得到了一个无效的令牌。我已经更新了帖子以显示这一点。不知道为什么它无效 错误说明了什么? 【参考方案1】:

是的,你可以。

使用 SetEmailAsync 查看user 电子邮件。 这仍然需要“确认”电子邮件,因此生成一个令牌,然后立即确认新的电子邮件地址。

类似:

await _userManager.SetEmailAsync(user, Input.NewEmail);

var token = await _userManager.GenerateEmailConfirmationTokenAsync(existingUser);

await _userManager.ConfirmEmailAsync(existingUser, token);

【讨论】:

这成功了!非常感谢 太好了,这是我发现的唯一方法,可以设置没有电子邮件流的确认电子邮件。

以上是关于使用 UserManager 更改用户的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

令牌无效。使用 UserManager.ConfirmEmailAsync(user.Id, code) 验证电子邮件验证码时

无法从 apicontroller 中的 OwinContext 获取 UserManager

DBContext更改后如何在控制器内创建新的UserManager对象

Mvc核心更改密码

游戏电竞椅子功能使用介绍

使用 usermanager 编辑用户个人资料图像