【发布时间】:2022-01-23 01:02:48
【问题描述】:
我在几个页面上调用了方法EmailConfirmation,所以我决定为此创建一个服务。
但我对GetEmailConfirmCallback 有疑问:Url 为空。
我还想更改身份区域页面并使用此服务,而不是在某些页面中,例如注册和外部登录,...每次都执行相同的任务。
这是我的课:
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 为空,但在 Register.cshtml.cs 中它不为空。
标签: c# asp.net-core asp.net-identity