【问题标题】:asp.net core Identity ConfirmEmailModel does not bind values correctly OnGetAsyncasp.net core Identity ConfirmEmailModel 未正确绑定值 OnGetAsync
【发布时间】:2021-04-10 06:20:20
【问题描述】:

我有一个 .net 核心 Blazor 项目,我已将 Identity 搭建到项目中。我已自定义 IdentityUser 以使用整数 ID 而不是默认值。

我在通过默认确认电子邮件的功能上遇到了一个奇怪的问题 https://localhost:44348/identity/account/manage/email 页面

这个内置页面有一个按钮,可以发布到 OnPostSendVerificationEmailAsync,如下所示:

public async Task<IActionResult> OnPostSendVerificationEmailAsync()
    {
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
        }

        if (!ModelState.IsValid)
        {
            await LoadAsync(user);
            return Page();
        }

        var userId = await _userManager.GetUserIdAsync(user);
        var email = await _userManager.GetEmailAsync(user);
        var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
        code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
        var callbackUrl = Url.Page(
            "/Account/ConfirmEmail", 
            pageHandler: null,
            values: new { area = "Identity", userId = userId, code = code },
            protocol: Request.Scheme);

        await _emailSender.SendEmailAsync(
            email,
            "Confirm your email", HtmlEncoder.Default.Encode(callbackUrl));

        //await _emailSender.SendEmailAsync(
        //    email,
        //    "Confirm your email",
        //    $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

        StatusMessage = "Verification email sent. Please check your email.";
        return RedirectToPage();
    }

我对该函数进行了细微的修改,但是这些更改不应影响回调 URL 生成的默认机制。基本上,这会生成一个电子邮件确认 URL,并向指定的用户帐户发送一封电子邮件。

我收到以下生成的邮箱 URL:

的https://本地主机:44348 /身份/帐户/ ConfirmEmail用户id = 1&代码= Q2ZESjhQcXM4RmJpR2xGT3I2NW41SUkxT0pXWnI5WlE5TUlhUndzSi9aQnA1ZGN4OTc5ZS9UOFFiR2xranhidFBWWTU2c3AxZ25peUYvamFaVUVhbG5ac3ArcHh5WkVNMVczUHVDQVBqMVdXUUFFeGdwU1FWZXo1eUxSVHZUU3dwb2RpUGVpTFhCTzhJSjhHR3ZpckVYNUZQMVJrUGhUU1FQOE52TnVWdU9jYVBKbXIyTkY4V05NVVhrVXVid2xQRFJzSTFRPT0 P>

但是,问题是目标 ConfirmEmail 没有正确绑定 userId 和 code。代码部分为空。

任何我在这里看不到的关于房间里大象的好主意将不胜感激。谢谢。

然而,代码为空

【问题讨论】:

标签: c# asp.net-core blazor identity


【解决方案1】:

显然,问题在于正在发送的电子邮件的 BODY 元素的格式。好的,现在一步一步来。

这段代码使用编码器对 URL 进行编码以遵循 this discussion 的规则

await _emailSender.SendEmailAsync(
            email,
            "Confirm your email",
            $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

编码器所做的部分工作是将与号变成这样:&amp;amp;

根据this thread

解决此问题的方法是将正文设置为“html”而不是“plain”,因为电子邮件内容是 HTML,并且回调 URL 生成 HTML 内容,该内容作为普通电子邮件发送给用户。

如果您将内容设置为 HTML,“&”将被转换为“&”并且电子邮件将显示正确的链接。

我想对于那些想坚持使用 PLAIN 电子邮件正文而不是 HTML 的人来说,他们几乎没有选择。

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 2017-08-25
    • 1970-01-01
    • 2019-11-05
    • 2020-05-29
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多