Я прочитал Введение в Identity в ASP. NET Core для реализации служб идентификации в моем ASP. NET Core 3 веб-приложении. Частью пошагового руководства по включению служб идентификации является создание класса EmailSender (описан здесь ) для отправки электронных писем регистрации учетной записи и т. Д. c. Моя проблема в том, что моя реализация EmailSender никогда не вызывается.
Следуя инструкциям на https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-3.1&tabs=visual-studio Я создал свою конкретную реализацию EmailSender:
public class EmailSender : IEmailSender
{
public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
...
}
, затем я регистрирую эту службу (вместе с другими битами, связанными с идентификацией) в Startup.cs со структурой внедрения зависимостей:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDefaultIdentity<IdentityUser>(
options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddTransient<IEmailSender, EmailSender>();
services.Configure<AuthMessageSenderOptions>(Configuration);
...
}
ASP. NET Core Identity Services автоматически генерирует код для регистрации, входа в систему и т. Д. c. и вызывает службу электронной почты следующим образом:
publi c class RegisterModel: PageModel {... private readonly IEmailSender _emailSender;
public RegisterModel(
...
IEmailSender emailSender)
{
...
_emailSender = emailSender;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
...
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
...
}
У меня проблема в том, что EmailSender никогда не бывает инстанцирован. Точки останова на всех методах и конструкторе (даже сделанном конструктором по умолчанию в качестве теста) не удаляются.
В моей отладке я вижу, что RegisterModel
создается, а emailSender
установлен. Но когда F11 просматривает оператор, который вызывает отправителя электронной почты:
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
, выполняется следующая следующая строка кода - никакой переход отладчика к EmailSender
вообще.
Это похоже на DI Для меня проблема с регистрацией, но тот факт, что IEmailSender.emailSender
не равен нулю, означает, что он видит конкретную реализацию.