Nó hoạt động theo cơ chế Dependency Injection (DI) và bạn phải tự cài đặt cách gửi email.
👉 Đây là interface, Identity chỉ biết gọi, không biết gửi bằng cách nào.
public interface IEmailSender
{
Task SendEmailAsync(string email, string subject, string htmlMessage);
}
2. Luồng hoạt động tổng quát
Controller / Razor Page
↓
_emailSender.SendEmailAsync(...)
↓
EmailSender (class bạn viết)
↓
SMTP / SendGrid / MailKit
↓
Email được gửi
👉 Identity không can thiệp vào bước này.
3. Cách _emailSender được inject (DI)
Đăng ký trong Program.cs
builder.Services.AddTransient<IEmailSender, SmtpEmailSender>();
👉 Khi ASP.NET Core tạo Controller:
- Nó thấy cần
IEmailSender - Nó tạo
SmtpEmailSender - Gán vào
_emailSender
4. Ví dụ implement _emailSender bằng SMTP
Ví dụ này chỉ minh họa, không có nội dung nhạy cảm.
using System.Net;
using System.Net.Mail;
public class SmtpEmailSender : IEmailSender
{
private readonly IConfiguration _config;
public SmtpEmailSender(IConfiguration config)
{
_config = config;
}
public async Task SendEmailAsync(string email, string subject, string htmlMessage)
{
var smtpClient = new SmtpClient(
_config["Email:SmtpServer"],
int.Parse(_config["Email:Port"])
)
{
Credentials = new NetworkCredential(
_config["Email:Username"],
_config["Email:Password"]
),
EnableSsl = true
};
var mail = new MailMessage
{
From = new MailAddress(_config["Email:From"]),
Subject = subject,
Body = htmlMessage,
IsBodyHtml = true
};
mail.To.Add(email);
await smtpClient.SendMailAsync(mail);
}
}
5. Cách gọi _emailSender trong Controller
await _emailSender.SendEmailAsync(
user.Email,
"Xác nhận email",
"Vui lòng nhấn link để xác nhận tài khoản."
);
👉 Controller chỉ gọi, không quan tâm SMTP.
6. _emailSender KHÔNG tự chạy
⚠️ Quan trọng:
_emailSenderkhông tự động gửi email- Identity không gọi nó
- Bạn phải gọi thủ công
Ví dụ:
- Sau khi đăng ký
- Khi reset password
- Khi resend email
4. Identity kết hợp _emailSender thế nào
Bước 1: Tạo User
await _userManager.CreateAsync(user, password);
Bước 2: Tạo token xác nhận email
var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
👉 Token được tạo bởi Data Protection API, không phải EmailStore.
Bước 3: Tạo link xác nhận
var link = Url.Action(
"ConfirmEmail",
"Account",
new { userId = user.Id, token = token },
Request.Scheme);
Bước 4: Gửi email
await _emailSender.SendEmailAsync(
user.Email,
"Xác nhận email",
$"Click vào link: <a href='{link}'>Confirm</a>");
Bước 5: User click link → xác nhận
await _userManager.ConfirmEmailAsync(user, token);
👉 Lúc này:
UserManagergọiIUserEmailStore.SetEmailConfirmedAsync(...)- Lưu
EmailConfirmed = truevào DB
Identity chỉ hỗ trợ:
- Tạo token
- Xác nhận token
- Lưu trạng thái email
8. Vì sao Microsoft thiết kế như vậy?
✔ Không ép dùng SMTP
✔ Dùng được cho API / Mobile
✔ Thay SendGrid → SMTP không đổi code
✔ Dễ test (mock IEmailSender)
Để lại một phản hồi