如何在ASP.NET Core MVC & Entity Framework Web应用中集成用户账户邮箱验证
ASP.NET Core 3.1 MVC 邮箱验证实现指引
1. 新建邮件服务类
你的项目没有Services文件夹,直接手动创建:
- 右键项目 → 新建文件夹,命名为
Services - 在Services文件夹下新建
EmailSender.cs类,实现Identity自带的IEmailSender接口:
using Microsoft.AspNetCore.Identity.UI.Services; using System.Net; using System.Net.Mail; using System.Threading.Tasks; namespace 你的项目命名空间.Services { public class EmailSender : IEmailSender { private readonly string _smtpServer; private readonly int _smtpPort; private readonly string _smtpUsername; private readonly string _smtpPassword; public EmailSender(string smtpServer, int smtpPort, string smtpUsername, string smtpPassword) { _smtpServer = smtpServer; _smtpPort = smtpPort; _smtpUsername = smtpUsername; _smtpPassword = smtpPassword; } public Task SendEmailAsync(string email, string subject, string htmlMessage) { var client = new SmtpClient(_smtpServer, _smtpPort) { Credentials = new NetworkCredential(_smtpUsername, _smtpPassword), EnableSsl = true }; return client.SendMailAsync( new MailMessage(from: _smtpUsername, to: email, subject, htmlMessage) { IsBodyHtml = true }); } } }
2. 配置邮件参数与依赖注入
- 打开
appsettings.json,添加邮件服务器配置:
"EmailSettings": { "SmtpServer": "smtp.example.com", "SmtpPort": 587, "SmtpUsername": "你的邮箱地址", "SmtpPassword": "邮箱授权码/密码" }
- 打开
Startup.cs,在ConfigureServices方法中注册邮件服务:
using 你的项目命名空间.Services; using Microsoft.Extensions.Configuration; // 加入以下代码 var emailSettings = Configuration.GetSection("EmailSettings"); services.AddTransient<IEmailSender, EmailSender>(options => new EmailSender( emailSettings["SmtpServer"], int.Parse(emailSettings["SmtpPort"]), emailSettings["SmtpUsername"], emailSettings["SmtpPassword"]));
3. 修改注册逻辑发送验证邮件
你已经通过Scaffold生成了Register页面,对应的后台代码在Areas/Identity/Pages/Account/Register.cshtml.cs:
- 注入
IEmailSender服务:
private readonly IEmailSender _emailSender; public RegisterModel( UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, ILogger<RegisterModel> logger, IEmailSender emailSender) { _userManager = userManager; _signInManager = signInManager; _logger = logger; _emailSender = emailSender; }
- 在
OnPostAsync方法的注册成功分支(result.Succeeded为true时),添加生成验证链接并发送邮件的代码:
if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); var userId = await _userManager.GetUserIdAsync(user); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, values: new { area = "Identity", userId = userId, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "确认你的邮箱", $"请点击<a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>这里</a>完成账户验证。"); // 保留原有跳转逻辑 if (_userManager.Options.SignIn.RequireConfirmedAccount) { return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }); } else { await _signInManager.SignInAsync(user, isPersistent: false); return LocalRedirect(returnUrl); } }
- 记得添加必要的命名空间:
using System.Text; using System.Text.Encodings.Web; using Microsoft.AspNetCore.WebUtilities;
4. 确认验证页面存在
如果Areas/Identity/Pages/Account/ConfirmEmail.cshtml不存在,通过Scaffold生成:右键项目 → 添加 → 新建搭建基架的项目 → 选择Identity → 勾选ConfirmEmail页面,点击生成即可。
注意事项
- 邮件服务器配置需对应实际邮箱:比如Gmail需开启应用密码,企业邮箱需使用对应SMTP地址和端口
- 生产环境不要硬编码邮箱密码,建议用Secret Manager或环境变量存储敏感信息
- ASP.NET Core 3.1的Identity默认使用Razor Pages,所以逻辑都在
.cshtml.cs文件中,而非传统的AccountController
内容的提问来源于stack exchange,提问作者Hamza Abbasi
相关产品推荐
相关产品推荐

