c# - ASP.Net Core 3.1 身份 - 生成密码重置 token 问题

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

我正在开发一个网站,用户可以在该网站上单击“忘记密码”按钮来重置密码。

目前,一旦电子邮件经过验证,以下代码应生成一个 token 以通过电子邮件发送给用户:

if(validUser != null)
        {
            var generationTime = DateTime.Now;
            var pwToken = await _userManager.GeneratePasswordResetTokenAsync(validUser);
            await _userManager.UpdateAsync(validUser);

            var url = $"https://{Request.Host}/verify/{HttpUtility.UrlEncode(pwToken)}";

            //EmailHelper.SendMagicLinkEmail(validUser, url, Request);

            return new RedirectResult("/");
        }

所有关于此的在线信息似乎都表明这是做事的方式。我也在 Startup.cs 文件中设置了默认 token 提供程序:

identityOptions: o => {
                    o.User.RequireUniqueEmail = true;
                    o.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultProvider;
                    o.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultProvider;
                    
                },

然而,当生成 token 时,它会生成一个大 token ,如下所示:

CfDJ8CnvAYtZf+1IjXpKUM7+umDYEaImg2SPFglPX3Y8RmYpEfg5zpK8xL54lvlbJUd54CaIzzYlff/GU+xKKS8mmG5UdC1zdk24nOsJNpIlmC3P5V72BchS4P9DGFTR77XiKbMAAYymnMomS2zCdTKh+E4bn9RI6FVinMecG1HR7nSHmOI2McbXHBFTanI/0uwxH5WI/Dj4AFTBP39ni7mfKkeWz2nJ5pTemELJJ6pYP50+

这里的问题显然是正斜杠,它会导致路由问题,因此在此处编码:

var url = $"https://{Request.Host}/verify/{HttpUtility.UrlEncode(pwToken)}";

问题是,即便如此,.Net Core 似乎仍未对其进行编码,并在访问生成的链接时产生以下错误: error

这个错误不一定是问题所在,我明白它的重要性。然而,我似乎无法找到任何解释为什么这个 token 会以这种方式表现。所有在线示例似乎都生成了相当标准的 GUID 样式 token ,而不是像这样的东西。

有谁知道为什么会这样?

干杯

最佳答案

您可能想尝试 Url.Action() 方法:

例子:

    var token = userManager.GeneratePasswordResetTokenAsync(user).Result;
    var resetLink = Url.Action("ResetPassword","Account", new { token = token }, protocol: HttpContext.Request.Scheme);
    var message = "<a href=\"" + resetLink + "\">Click here to reset your password</a>";
    //Then send your message to the user

请注意,在上面的示例中,电子邮件必须是 HTML 才能使链接生效

关于c# - ASP.Net Core 3.1 身份 - 生成密码重置 token 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66355352/

相关文章:

c# - 如何按升序将来自其他两个列表 C# 的元素存储在列表中?

.net - Session.Timeout 和 Server.ScriptTimeout 有什么区别?

c# - 'ref' 属性不能存在。 C#中的验证错误

c# - 用户控件作为具有绑定(bind)的数据模板

c# - 以图形方式模板化 .NET winforms 应用程序

c# - 如何在 ASP.NET Core Angular 应用程序中使用 SignalR Stream?

c# - 如何在 Angular 6 中上传文件时修复 415 不受支持的媒体类型

asp.net-core - Blazor 身份验证 - Http 调用确实适用于匿名

c# - 如何序列化从字典派生的类

.net - 从 AKS 访问 Azure Blob 存储