我见过很多示例,其中用户确认注册是通过使用通过 WebSecurity 生成的令牌来完成的,该令牌链接到简单的成员资格,但为了控制我自己的代码,我编写了很多用户注册和登录的代码使用实体框架进行数据库访问,而不是尝试对抗繁琐的自动生成的模板,这些模板不会让我了解正在发生的事情,也让我对正在发生的事情没有信心。我必须诚实地说,这就是我对它们的感觉,因为它们没有显示任何关于用户数据库如何与我编写的任何自定义函数交互的代码。
所以我的疑问是是否有人使用自定义令牌进行电子邮件验证而不必使用 websecurity.CreateAccount 方法?
我必须对已经完美健全且功能齐全的代码进行一些重构,这将是一种耻辱。非常感谢提前
是否有人使用自定义令牌进行电子邮件验证而不必使用 websecurity.CreateAccount 方法?
当然 - 我们对所有电子邮件验证令牌都执行此操作,这是我们“CreateAccount”流程的一部分。您可以执行类似的操作来生成令牌:
public static string GenerateEmailToken()
{
// generate an email verification token for the user
using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider())
{
byte[] data = new byte[16];
provider.GetBytes(data);
return Convert.ToBase64String(data);
}
}
然后我将其包含在我们的“CreateAccountResponse”中,它允许控制器接收它并发送包含令牌的验证电子邮件 - 给您一个想法:
public class CreateAccountResponse
{
public bool CreatedSuccessfully { get; set; }
public string EmailVerificationToken { get; set; }
}
然后我们在这里处理:
CreateAccountResponse response = _mediator.Send(createAccountCommand);
if (response.CreatedSuccessfully)
{
if (!string.IsNullOrEmpty(response.EmailVerificationToken))
{
// Send the verification email if a token is present
SendVerificationEmail(model.Email, response.EmailVerificationToken);
}
return RedirectToAction("Settings", "Account");
}
然后使用令牌,我们创建完全格式化的 URL 以包含在您发送给该用户的电子邮件中
private void SendVerificationEmail(string emailAddress, string token)
{
try
{
// Url.Action will encode parameters as they are needed.
var verificationUrl = Url.Action("VerifyAccount", "Account", new { token = token }, Request.Url.Scheme);
_userMailer.DeliverVerification(emailAddress, verificationUrl);
}
catch (Exception ex)
{
_logger.ErrorLog.Log(new VerificationError(ex));
}
}
一旦他们点击电子邮件中的链接,我们的“VerifyAccount”路线就会获取令牌并允许我们完成其余的验证过程。
此外,出于安全目的,为您的验证令牌设置一个到期时间是一个“非常好”的主意 - 24 到 48 小时通常是可接受的时间范围,以允许用户接收电子邮件、单击链接并验证其信息帐户。
public class EmailService : IEmailService
{
IConfiguration _configuration { get; }
public static bool NeedUpdate { get; set; } = true;
public static SmtpClient Client { get; private set; }
public static MailAddress Support { get; private set; }
public EmailService(IConfiguration configuration)
{
_configuration = configuration;
if (EmailService.NeedUpdate)
{
Client = new SmtpClient(_configuration["Email:Host"],
Convert.ToInt32(_configuration["Email:Port"]));
DevReport.ConsoleLog(_configuration["Email:Host"]);
Client.EnableSsl = true;
Client.Credentials = new NetworkCredential(_configuration["Email:Username"],
_configuration["Email:Password"]);
Support = new MailAddress(_configuration["Email:Username"], "Jafar Fun Games");
EmailService.NeedUpdate = false;
}
}
public bool Send(string mail, string header, string body, bool isHtml)
{
MailAddress to = new(mail);
MailMessage message = new(EmailService.Support, to)
{
Body = body,
Subject = header,
IsBodyHtml = isHtml
};
Client.Send(message);
return true;
}