【问题标题】:Razor Engine: URL generation in template of & generates &Razor 引擎:在 & 的模板中生成 URL,生成 &
【发布时间】:2019-04-19 07:44:14
【问题描述】:

我有一个使用 Identity 进行用户管理的 ASP.NET Core 应用程序。

我有一个MailProvider,它准备了一封电子邮件以通过 smtp 发送用于帐户激活目的:

// ...
var activationMailViewModel = new ActivationMailViewModel()
{
    LastName = user.LastName,
    FirstName= user.FirstName,
    UserName = userName,
    Email = user.Email,
    CompanyName = companyName,
    Url = url.Action("ConfirmEmail", "Account", new { Area = "", code = token, userId = user.Id }, request.Scheme)
};
// ...
var result = Engine.Razor.RunCompile(new LoadedTemplateSource($"Activation", path), "SendUserAccountCreation" + Guid.NewGuid(), null, activationMailViewModel);
// ...

 var mailMessage = new MailMessage(
                new MailAddress("kyc@vente-privee.com", "KYC-vente-privee.com"),
                new MailAddress(user.Email, userName))
            {
                Subject = GetGlobalString("ActivationMail_Subject", cultureCode),
                BodyEncoding = System.Text.Encoding.UTF8,
                SubjectEncoding = System.Text.Encoding.UTF8
            };

<p><a href="@Model.Url" class="button">ACTIVATE MY ACCOUNT</a></p>

但是,由于在 url 的查询字符串中将字符 &amp;amp; 转录为 &amp;amp;,因此生成的链接似乎可以用两种不同的方式进行解释。

http://base.url.net/Account/ConfirmEmail?code=CfDJ8PtYvJr8Ve1GnxXJykedIzKTQDg%2FTXBwV6NmIYMy8Gi7yUbqZagGbZRacKSFrE717h%2FGjmm6l8QA3knPPgxyNnM1vxe3wb6KnFsGtZUOMTas7QhX1MW5dE4cU5sorA99Dz03zV8ldVMOMP5BGfUrts2nNQqbs8dNLPNgupdkNzaWa4q6fM5u9E99CzRcFjAn7nnd57Ht3IIREAqz6lqufFYo469%2BN2VJxmNJJ1p6OAvO6dMJ9M%2Fzdz3xkpBajJbxRw%3D%3D**&**userId=21e4673c-f121-417f-9837-7f5b234f6f01

http://base.url.net/Account/ConfirmEmail?code=CfDJ8PtYvJr8Ve1GnxXJykedIzKTQDg%2FTXBwV6NmIYMy8Gi7yUbqZagGbZRacKSFrE717h%2FGjmm6l8QA3knPPgxyNnM1vxe3wb6KnFsGtZUOMTas7QhX1MW5dE4cU5sorA99Dz03zV8ldVMOMP5BGfUrts2nNQqbs8dNLPNgupdkNzaWa4q6fM5u9E99CzRcFjAn7nnd57Ht3IIREAqz6lqufFYo469%2BN2VJxmNJJ1p6OAvO6dMJ9M%2Fzdz3xkpBajJbxRw%3D%3D**&**userId=21e4673c-f121-417f-9837-7f5b234f6f01

这对我的AccountController 来说可能是个问题:

[Authorize]
public class AccountController : BaseController
{

    // GET: /Account/ConfirmEmail
    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string code, string userId)
    {
        if (code == null || userId == null)
        {
            return View("Error");
        }

    // Rest of the code... not relevant to the question
}

如果浏览器/邮件客户端将&amp;amp;解释为&amp;amp;,那么userId将被设置为null并且无法确认帐户/电子邮件。

例如:

  • ProtonMail 上:我可以单击的链接指向一个在查询字符串中使用&amp;amp; 的地址,这很好。
  • Gmail:&amp;amp; 上,因此链接无法确认电子邮件。

但是,在这两个电子邮件提供商中,纯文本显示使用 Razor 引擎生成的 url 是:&amp;amp;

什么是最好的策略,这样我的用户就不会得到一个不起作用的链接。

【问题讨论】:

    标签: c# asp.net-core razor html-email razorengine


    【解决方案1】:

    似乎问题在于未应用于电子邮件的原始格式。

    here on SO给出的答案:

    在处理电子邮件时,我使用 RazorEngine.Templating 中的 RazorEngineService,例如就我而言,它看起来像这样:

    using RazorEngine.Templating;
    
    RazorEngineService.Create().RunCompile(html, ...) 
    

    假设您使用的是相同的程序集,@Html.Raw 不存在这种用法。我 > 终于能够通过在我的电子邮件中执行此操作来获得原始 HTML 输出:

    @using RazorEngine.Text
    
    @(new RawString(Model.Variable))
    

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2017-07-27
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多