Миграция ASP.NET MVC в ASP.NET CORE 2.2: как отправлять сообщения (SMS, электронная почта и т. Д.) - PullRequest
0 голосов
/ 27 мая 2019

Сборка MVC: Microsoft.AspNet.Identity.UserManager

Сборка CORE: Microsoft.Extensions.Identity.Core

Я мигрирую из MVC в .NET CORE 2.2.Я создал класс MyManager, который наследуется от UserManager.Класс UserManager в MVC имеет следующие свойства:

public IIdentityMessageService EmailService { get; set; }

public IIdentityMessageService SmsService { get; set; }

В .NET CORE 2.2., UserManager не имеетэти свойства.Я предполагаю, что MVC UserManager использует эти свойства для автоматической отправки сообщений.Похоже, он использует EmailService для автоматической отправки сообщения, подтверждающего адрес электронной почты.Однако такое поведение, по-видимому, не происходит в .NET CORE.Итак, похоже, что UserManager больше не справляется с этим.

Вопрос в следующем: как вы проверяете адрес электронной почты пользователя?

Это обрабатывается в другой сборке Microsoft или Microsoft вышла из этого бизнеса и перенесла его в стороннюю сборку?Или есть что-то еще?

1 Ответ

1 голос
/ 27 мая 2019

вот так я отправляю подтверждение по электронной почте, используя Sendgrid в ядре asp.net.

шаг 1: Создайте класс с именем EmailSender, который реализует интерфейс IEmailSender (необходимо включить с использованием 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

 services.AddTransient<IEmailSender, EmailSender>();

Шаг 3: Вставьте его в конструктор класса, в котором вы хотите его использовать.

   [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();
    }

, и это должно отправить ваше письмо,это работает для меня и для вас тоже.

...