Razor Engine: генерация URL в шаблоне & генерирует & - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть приложение ASP.NET Core, которое использует Identity для управления пользователями.

У меня есть 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>

Однако создается впечатление, что сгенерированная ссылка может интерпретироваться двумя различными способами из-за транскрипции символа & в &amp; в строке запроса URL.

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

Что может быть проблематично для my 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;, тогда userId будет установлен на null, и учетная запись / электронная почта не будут подтверждены.

Например:

  • Вкл. ProtonMail : ссылка, по которой я могу щелкнуть, приводит к адресу, который в строке запроса использует &, что вполне нормально.
  • Вкл. Gmail : &amp; и, следовательно,ссылка не подтверждает электронную почту.

Однако в обоих провайдерах электронной почты простой текст показывает, чтоURL был создан с помощью движка Razor: &amp;.

Какова лучшая стратегия, чтобы мои пользователи не получали ссылку, которая не работает.

1 Ответ

0 голосов
/ 19 апреля 2019

Кажется, проблема была в необработанном форматировании, которое не было применено к электронному письму.

Ответ, данный здесь на SO :

При работе с электронной почтой я использую RazorEngineService в RazorEngine.Templating, например в моем случае это выглядит так:

using RazorEngine.Templating;

RazorEngineService.Create().RunCompile(html, ...) 

Если вы используете одну и ту же сборку, @ Html.Raw не существует с таким использованием. Я наконец смог получить необработанный вывод HTML, выполнив это в моих электронных письмах:

@using RazorEngine.Text

@(new RawString(Model.Variable))
...