【发布时间】:2020-06-10 23:20:24
【问题描述】:
我阅读了Introduction to Identity on ASP.NET Core 以在我的 ASP.NET Core 3 Web 应用程序中实现身份服务。启用身份服务的部分演练是创建一个 EmailSender 类(描述为here)以发送帐户注册电子邮件等。我的问题是我的 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 自动生成注册、登录等代码,调用邮件服务如下:
公共类 RegisterModel : PageModel { ... 私有只读 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 是非 null 的事实意味着它看到了具体的实现。
【问题讨论】:
-
检查配置服务中的顺序。也许在 authmessagesenderoptions 之后调用 emailservice?当您在密码可用之前注册电子邮件发件人时,我正在考虑密码等不存在
-
@JohanHerstad 不幸的是,结果没有变化。我确实进行了交换并尝试了它,但我还仔细检查了 Microsoft 文档并验证了正确的顺序。
标签: asp.net-core dependency-injection asp.net-core-identity