[英]ASP.NET Core 3.1 create a service to send email confirmation
我在多個頁面上調用了EmailConfirmation
方法,因此我決定為此創建一個服務。
但我對GetEmailConfirmCallback
有疑問: Url
是 null。
我也想更改身份區域頁面並使用此服務,而不是在注冊和外部登錄等某些頁面中使用此服務...每次都執行相同的任務。
這是我的 class:
public class ApplicationServices : ControllerBase
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly IEmailSender _emailSender;
private readonly IWebHostEnvironment _webHostEnvironment;
public ApplicationServices(IEmailSender emailSender, UserManager<ApplicationUser> userManager, IWebHostEnvironment webHostEnvironment)
{
_emailSender = emailSender;
_userManager = userManager;
_webHostEnvironment = webHostEnvironment;
}
public async Task<ResultModel> EmailConfirmation(ApplicationUser user, string returnUrl = "/Identity/Account/Login")
{
ResultModel resultModel = new ResultModel();
try
{
var pathToEmailTemplate = _webHostEnvironment.WebRootPath
+ Path.DirectorySeparatorChar.ToString()
+ "templates"
+ Path.DirectorySeparatorChar.ToString()
+ "email_templates"
+ Path.DirectorySeparatorChar.ToString()
+ "confirm-email-reset-password.html";
string emailTemplateString = string.Empty;
using (StreamReader SourceReader = System.IO.File.OpenText(pathToEmailTemplate))
{
emailTemplateString = SourceReader.ReadToEnd();
}
string messageSubject = "Confirm your email";
string messageBody = $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(await GetEmailConfirmCallback(user, returnUrl))}'>clicking here</a>.";
string messageSenderName = "Support team.";
string emailMessage = string.Format(emailTemplateString, messageSubject, string.IsNullOrEmpty(user.FullName) ? user.FullName : "User", messageBody, messageSenderName);
await _emailSender.SendEmailAsync(user.Email, messageSubject, emailMessage);
resultModel.IsSucceed = true;
return resultModel;
}
catch (Exception e)
{
resultModel.IsSucceed = false;
resultModel.Message = e.Message;
return resultModel;
}
}
private async Task<string> GetEmailConfirmCallback(ApplicationUser user, string returnUrl)
{
var codeEmail = await _userManager.GenerateEmailConfirmationTokenAsync(user);
codeEmail = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(codeEmail));
var callbackUrlEmail = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = codeEmail, returnUrl },
protocol: Request.Scheme);
return callbackUrlEmail;
}
}
任何建議或幫助將不勝感激。
您是否嘗試過使用Url.Action
而不是Url.Page
? Url.Action
用於 MVC, Url.Page
用於 Razor。 您沒有指定您使用的是 Razor 還是 MVC。
HttpContextAccessor
services.AddHttpContextAccessor();
IHttpContextAccessor
和LinkGenerator
作為依賴注入 classprivate readonly UserManager<ApplicationUser> _userManager;
private readonly IEmailSender _emailSender;
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly LinkGenerator _generator;
public ApplicationServices(UserManager<ApplicationUser> userManager,
IEmailSender emailSender,
IWebHostEnvironment webHostEnvironment,
IHttpContextAccessor httpContextAccessor,
LinkGenerator generator)
{
_userManager = userManager;
_emailSender = emailSender;
_webHostEnvironment = webHostEnvironment;
_httpContextAccessor = httpContextAccessor;
_generator = generator;
}
GetEmailConfirmCallback
private async Task<string> GetEmailConfirmCallback(ApplicationUser user, HttpContext context, string returnUrl)
{
var codeEmail = await _userManager.GenerateEmailConfirmationTokenAsync(user);
codeEmail = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(codeEmail));
var callbackUrlEmail = _generator.GetUriByPage(_httpContextAccessor.HttpContext,
page:"/Account/ConfirmEmail",
handler: null,
values: new { area = "Identity", userId = user.Id, code = codeEmail, returnUrl });
return callbackUrlEmail;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.