【问题标题】:.NET Core Identity forgot password broken.NET Core Identity 忘记密码已损坏
【发布时间】:2022-01-08 01:23:16
【问题描述】:

我正在使用带有 .NET 5 的脚手架身份。我尝试了登录页面上的“忘记密码”链接。这样做是因为发送的电子邮件中包含重置密码的链接。

但是,单击电子邮件中的链接会导致与格式错误的 base 64 代码相关的错误。输入格式错误:321 是无效输入。

base 64 代码存在,但存在问题。 base 64 代码是这样生成的:

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

            await _emailSender.SendEmailAsync(
                Input.Email,
                "Reset Password",
                $"Please reset your password by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); 

它在 ResetPassword.cshtml.cs GET 上中断。

  if (code == null)
        {
            return BadRequest("A code must be supplied for password reset.");
        }
        else
        {
            Input = new InputModel
            {
                Code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code))
            };
            return Page();
        }

谁能指出我解决这个问题的正确方向?我不确定它是否相关,但我使用的是 SendGrid 的 SMTP 服务器。

更新。我发现代码末尾有一个尾随逗号。删除它可以解决问题。

 code = code.Replace("'", "");

现在我只需要找出它是如何到达那里的。

【问题讨论】:

    标签: passwords .net-5 identity


    【解决方案1】:

    尝试并排除以下。

    1. 已关闭 SendGrid 链接跟踪。
    2. 已关闭 Outlook 安全链接。

    以上没有区别。

    然后我突然意识到电子邮件链接没有呈现为 HTML。即它显示的是链接文本,而不仅仅是“点击这里”。

    然后我读到 smtp 客户端现已过时,MS recommends using MailKit instead.

    所以我决定使用 Mailkit 将我的电子邮件发件人代码替换为以下代码,问题就消失了。

     public Task SendEmailAsync(string email, string subject, string htmlMessage)
        {
            var message = new MimeMessage();
            message.From.Add(new MailboxAddress("(Admin)", "test@test.com"));
            message.To.Add(new MailboxAddress("Recipient Name", email));
            message.Subject = subject;
    
            message.Body = new TextPart("html")
            {
                Text = htmlMessage
            };
    
            string Username = _config["MailSettings:Username"];
            string Password = _config["MailSettings:Password"];
            var port = Convert.ToInt32(_config["MailSettings:Port"]);
    
            using var client = new SmtpClient();
    
            client.Connect(_config["MailSettings:Host"], port, false);
            client.Authenticate(Username, Password);
    
            try
            {
                client.Send(message);
                client.Disconnect(true);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
    
            return Task.CompletedTask;
    
        }
    

    我认为这是拯救这一天的部分:

     message.Body = new TextPart("html")
            {
                Text = htmlMessage
            };
    

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2018-01-28
      相关资源
      最近更新 更多