繁体   English   中英

ASP.NET Core 3.1 创建服务发送email确认

[英]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;
    }
}

调试图像 1

调试图像 2

任何建议或帮助将不胜感激。

您是否尝试过使用Url.Action而不是Url.Page Url.Action用于 MVC, Url.Page用于 Razor。 您没有指定您使用的是 Razor 还是 MVC。

好的,这是过去链接中的一些细节

他们使用了一个 URL.Action 像这个例子: 在此处输入图像描述

在您的代码中,您使用的是 Url.Page。

这是使用 Url.Action 的其他示例: 在此处输入图像描述

  1. 在 Startup.cs 中注册HttpContextAccessor
services.AddHttpContextAccessor();
  1. 在服务中添加IHttpContextAccessorLinkGenerator作为依赖注入 class
private 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;
}
  1. 更改方法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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM