【问题标题】:ASP.NET Core 3.1 create a service to send email confirmationASP.NET Core 3.1 创建服务发送电子邮件确认
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢您的评论,我正在尝试从剃须刀页面和控制器调用EmailConfirmation。我将 ApplicationServices 添加到 startup.cs 并通过依赖注入,我想在所有区域的任何地方访问这个类 Identity 是由脚手架制作的,以及我基于 MVC 创建的另一个区域。
  • 我按照你所说的 Url.Action 更改了我的代码,但错误是一样的,因为 Url 为空。
  • 如果你使用 Razor,你应该使用Url.Page。如果您可以使用 startup.csEmailSender 类的实现来更新您的代码示例,也许我们可以帮助您找到问题。
  • 我通过将 HttpContext 从控制器或剃须刀页面传递给 EmailConfirmation 方法解决了我的问题。而Url 我使用字符串格式来创建回调 URL。也许这不是一种专业的方式,但它现在可以工作,以后我会改进代码。感谢所有评论者。
【解决方案2】:

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

他们使用了一个 URL.Action 像这个例子:

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

这是另一个使用 Url.Action 的例子:

【讨论】:

  • 我按照你说的 Url.Action 更改了我的代码,但错误是一样的,因为 Url 为空。
猜你喜欢
  • 2023-04-04
  • 2021-11-19
  • 2020-04-28
  • 2020-07-20
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多