ASP.NET MVC 到 ASP.NET CORE 2.2 迁移:如何发送消息(短信、电子邮件等)

ASP.NET MVC to ASP.NET CORE 2.2 migration: How to send messages (SMS, email, etc.)

MVC 程序集: Microsoft.AspNet.Identity.UserManager

核心组件: Microsoft.Extensions.Identity.Core

我正在从 MVC 迁移到 .NET CORE 2.2。我创建了一个继承自 UserManagerMyManager class。 MVC中的UserManagerclass有如下属性:

public IIdentityMessageService EmailService { get; set; }

public IIdentityMessageService SmsService { get; set; }

在 .NET CORE 2.2 中,UserManager 没有这些属性。我猜测 MVC UserManager 使用这些属性来自动发送消息。看起来它使用 EmailService 自动发送验证电子邮件地址的消息。但是,这种行为似乎不会发生在 .NET CORE 中。所以,看起来 UserManager 不再处理这个问题。

问题是:如何验证用户的电子邮件地址?

这是在不同的 Microsoft 程序集中处理,还是 Microsoft 退出该业务并将其委托给第 3 方程序集?或者,还有别的吗?

这就是我在 asp.net 核心中使用 Sendgrid 发送电子邮件验证的方式。

第 1 步: 创建一个名为 EmailSender 的 class 实现 IEmailSender 接口(需要包括 using Microsoft.AspNetCore.Identity.UI.Services; 对于 IEmailSender) :

 public class EmailSender : IEmailSender
{
    public async Task SendEmailAsync(string email, string subject, string htmlMessage)
    {
        var apiKey = "send grid api key";
        //it looks like this  :
        // var apiKey = "SG.2MpCzyTvIQ.WhHMg6-VBjuqbn9k-8P9m6X9cHM73fk2fzAT5sA4zKc"; 

        var client = new SendGridClient(apiKey);
        var from = new EmailAddress($"noreply@domaimName.com", "Email title");
        var to = new EmailAddress(email, email);
        var plainTextContent = htmlMessage;
        var htmlContent = htmlMessage;
        var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
        try
        {
            var response = await client.SendEmailAsync(msg);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        //return Task.CompletedTask;
    }
}

第 2 步: 您需要在 Startup.cs 文件 [=17] 中使用 依赖注入 将其添加为服务=]

 services.AddTransient<IEmailSender, EmailSender>();

第 3 步: 将其注入到要使用它的 class 的构造函数中。

   [AllowAnonymous]
public class RegisterModel : PageModel
{
      private readonly IEmailSender _emailSender;

    public RegisterModel(IEmailSender emailSender)
    {
        _emailSender = emailSender;
    }

     public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        returnUrl = returnUrl ?? Url.Content("~/");
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser
                           {
                                UserName = Input.Email,
                                Email = Input.Email,
                                DateCreated = DateTime.Now
                            };
            var result = await _userManager.CreateAsync(user, Input.Password);
            if (result.Succeeded)
            {
                _logger.LogInformation("User created a new account with password.");
                returnUrl = Url.Action("ConfirmEmail", "Home");
                var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                await _userManager.AddToRoleAsync(user,"ROleName");
                var callbackUrl = Url.Page(
                    "/Account/ConfirmEmail",
                    pageHandler: null,
                    values: new { userId = user.Id, code = code },
                    protocol: Request.Scheme);
               await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                    $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
                return LocalRedirect(returnUrl);
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        // If we got this far, something failed, redisplay form
        return Page();
    }

这应该会发送您的电子邮件。它对我有用,对你也应该有用。