作者:暖心我在这_若惜 | 来源:互联网 | 2023-09-17 21:16
我正在构建我的第一个ASP.NET Core Razor Pages应用程序。
我创建了一个EmailSender
类,该类实现了IEmailSender
。
public class EmailSender : IEmailSender
{
private readonly EmailSettings Settings;
public EmailSender(IOptions emailSettings)
{
Settings = emailSettings.Value;
}
public async Task SendEmailAsync(string email,string subject,string htmlMessage)
{
using (MailMessage message = new MailMessage())
using (SmtpClient client = new SmtpClient())
{
client.Host = Settings.Host;
client.Port = Settings.Port;
client.Credentials = new NetworkCredential(Settings.username,Settings.Password);
client.EnableSsl = Settings.EnableSsl;
message.To.Add(email);
message.From = new mailaddress(Settings.FromAddress);
message.Subject = subject;
message.Body = htmlMessage;
message.IsBodyHtml = true;
await client.SendMailAsync(message);
}
await Task.CompletedTask;
}
}
而且我已经在Startup.cs中注册了EmailSender
。
public void ConfigureServices(IServiceCollection services)
{
// Default initialization...
services.AddTransient();
services.Configure(Configuration.GetSection("EmailSettings"));
}
我的代码没有错误构建。
使用断点,可以看到当我运行应用程序并单击忘记密码时,将调用EmailSender
构造函数,并且EmailSettings
实例具有预期的值。输入我的电子邮件地址并单击重置密码时,将再次调用EmailSender
构造函数。但是,不会永远不会调用EmailSender.SendEmailAsync()
,也不会发送电子邮件。
我确信我的EmailSender
类已正确设置,因为正在调用构造函数。但是我不知道如何找出从未被称为SendEmailAsync()
的原因。
有人有建议吗?
脚手架身份
您需要使用身份标识来调试代码。
右键单击“标识”文件夹,然后单击
在左侧菜单中单击
然后
现在您的剃须刀页面的代码后面有代码,因此请单击箭头以展开文件后面的代码。
在PostAsync()
中的if语句上放置一个断点。
if (user == null || !(await _userManager.IsEmailConfirmedAsync(user))) // Breakpoint here
{
...
}
运行该应用程序并执行“忘记密码”请求。
您的断点将命中,您将能够进行调试。因为等待_userManager.IsEmailConfirmedAsync(user)
是 false 。它不会退出if语句。
通过将调试器拖到该循环之外来解决该问题,然后继续进行。现在,您将看到将呼叫您的电子邮件发件人,并且您的SendEmailAsync将被命中。
总结
- 身份团队通过一个图书馆软件包为您提供“魔术”登录,注销和帐户页面。
- 要访问代码,您需要对它们进行脚手架。
- 您没有点击
SendEmailAsync
,因为您尝试为其输入密码的用户很可能不是或,因此未确认您用户的电子邮件! li>
,
请确认您的AccountController
调用了IEmailSender.SendEmailAsync
方法。参见此处的示例:https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/security/authentication/identity/sample/src/ASPNETCore-IdentityDemoComplete/IdentityDemo/Controllers/AccountController.cs#L375
ForgotPassword
操作中有一行:
await _emailSender.SendEmailAsync(model.Email,"Reset Password",$"Please reset your password by clicking here: link");