【问题标题】:Email Confirmation Asp.net MVC电子邮件确认 Asp.net MVC
【发布时间】:2016-08-06 06:03:33
【问题描述】:

我已经看到很多示例,其中用户确认注册是通过使用通过 WebSecurity 生成的令牌完成的,该令牌与简单的成员资格相关联,但为了控制我自己的代码,我编写了很多用户注册和使用实体框架从头开始登录以进行数据库访问,而不是尝试与繁琐的自动生成模板作斗争,这些模板不会让我对正在发生的事情进行细分,也不会让我对正在发生的事情充满信心。老实说,这就是我对它们的感觉,因为它们没有显示任何关于用户数据库如何与我编写的任何自定义函数交互的代码。

所以我的查询是是否有人使用自定义令牌进行电子邮件验证,而之前不必使用 websecurity.CreateAccount 方法?

我将不得不对已经完美的功能代码进行一些重构,这将是一种耻辱。非常感谢提前

【问题讨论】:

    标签: c# asp.net-mvc entity-framework email


    【解决方案1】:

    是否有人使用自定义令牌进行电子邮件验证,而之前不必使用 websecurity.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 小时通常是允许用户接受的时间范围要接收电子邮件,请点击链接并验证他们的帐户。

    【讨论】:

    • 这是我正在寻找的澄清。太棒了,谢谢磨坊。至少现在我知道我可以通过查看该模型在我的用户表中存储一个令牌。我看到的示例完全忽略了我对某些框架方法如何验证和处理此类问题的任何更基本的问题。我认为在这里问会很好的原因是,我正在与另一个 Java 开发人员交谈,有时编写自定义逻辑是没有害处的,这样您就不会完全依赖所有框架方法并失去对我正在做的事情的控制.非常感谢:)
    • 没问题,很高兴有帮助。由于这回答了您的问题,您应该将其标记为已接受的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2011-09-19
    • 2016-06-07
    • 2022-07-29
    相关资源
    最近更新 更多