簡體   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