首页 > 解决方案 > 在 Asp.net Identity 核心中确认不止一封电子邮件

问题描述

我有一个用例,我需要为同一用户确认两个电子邮件 ID。在 asp.net 核心中,我们有内置的 GenerateChangeEmailTokenAsync 和 ConfirmEmailAsync 方法,可用于确认一个电子邮件 ID。

有没有办法我可以另外确认一个?我搜索了网络,但找不到任何参考。

我知道我可能必须为此扩展上述方法。但是有没有更简单的方法来做到这一点,以便我可以使用现有的身份框架扩展来实现我的用例?

标签: asp.net-identity

解决方案


我已经实现了这样的多个电子邮件验证:电子邮件是身份核心处理的主要电子邮件,我在 ApplicationUser 生成电子邮件令牌中添加了一个额外的 LoginEmail:

if (!user.EmailConfirmed)
                    {
                        //send token for email confirmation 
                        var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                        var confirmationLink = Url.Action(nameof(ConfirmEmail), "Account", new { token, id = user.Id, email = user.Email }, Request.Scheme);

                        var message = new EmailMessage(user.Email, "Confirmation email link", confirmationLink);
                        await _emailService.SendMail(message);

                    }

                    if (!user.LoginEmailConfirmed)
                    {
                        var token1 = await _userManager.GenerateUserTokenAsync(user, "Default", "Confirmation");
                        var confirmationLoginEmailLink = Url.Action(nameof(ConfirmEmail), "Account", new { token = token1, id = user.Id, email = user.LoginEmail, }, Request.Scheme);

                        var message = new EmailMessage(user.LoginEmail, "Confirmation email link", confirmationLoginEmailLink);
                        await _emailService.SendMail(message);
                    }

确认部分:首先我检查要确认的电子邮件是否是 LoginEmail 然后我使用 VerifyUserTokenAsync 方法来验证令牌

if (user.LoginEmail == email)
        {
            var confirmationResult = await _userManager.VerifyUserTokenAsync(user, "Default", "Confirmation", token);
            if (confirmationResult)
            {
                user.LoginEmailConfirmed = true;
                var updateResult = await _userManager.UpdateAsync(user);
                return View(updateResult.Succeeded ? nameof(ConfirmEmail) : "Error", new ConfirmEmailViewModel() { EmailConfirmed = user.EmailConfirmed, LoginEmailConfirmed = user.LoginEmailConfirmed, LoginUrl = _config.Value.ClientUrl });
            }
            else
            {
                return View("Error");
            }
        }
        else {
            var result = await _userManager.ConfirmEmailAsync(user, token);
            return View(result.Succeeded ? nameof(ConfirmEmail) : "Error", new ConfirmEmailViewModel() { EmailConfirmed = user.EmailConfirmed, LoginEmailConfirmed = user.LoginEmailConfirmed, LoginUrl = _config.Value.ClientUrl });
        }

推荐阅读