我正在开发一个网站,用户可以在该网站上单击“忘记密码”按钮来重置密码。
目前,一旦电子邮件经过验证,以下代码应生成一个 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 似乎仍未对其进行编码,并在访问生成的链接时产生以下错误:
这个错误不一定是问题所在,我明白它的重要性。然而,我似乎无法找到任何解释为什么这个 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/