You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:35:16