如何检查密码重置令牌是否已过期?

2024-02-09

我正在使用 ASP.NET Identity,并且具有基本的忘记密码/重置密码功能。

当您填写忘记密码的表单时,它会使用以下命令创建一个重置令牌_userManager.GeneratePasswordResetTokenAsync(user)

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = await _userManager.FindByNameAsync(model.Email);
        if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
        {
            return View("ForgotPasswordConfirmation");
        }

        var code = await _userManager.GeneratePasswordResetTokenAsync(user);
        var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
        await _emailSender.SendEmailAsync(model.Email, "Reset Password",
               $"Please reset your password by clicking here: <a href='{callbackUrl}'>link</a>");
        return View("ForgotPasswordConfirmation");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

我注意到重置密码页面的唯一验证是检查代码是否为空,而不是检查它是否仍然有效或未过期。

[HttpGet]
[AllowAnonymous]
public IActionResult ResetPassword(string code = null)
{
    if (code == null)
    {
        throw new Exception("A code must be supplied for password reset.");
    }
    var model = new ResetPasswordViewModel { Code = code };
    return View(model);
}

它实际上不会检查令牌是否有效,直到您尝试重置密码并调用_userManager.ResetPasswordAsync(user, model.Code, model.Password)

我希望能够验证当他们点击“重置密码”页面向用户显示消息时代码仍然有效,而不是在他们尝试重置密码后。

有没有办法检查是否有效?


以下代码可验证重置令牌是否有效:

1. 创建代码并将其发送给用户

var code = await this._userManager.GeneratePasswordResetTokenAsync(user);

2. 验证令牌

[HttpGet]
public async Task<IActionResult> ResetPassword(string UserId, string token)
{
    ...

    ApplicationUser user = //get user;


    if(!await this._userManager.VerifyUserTokenAsync(user,this._userManager.Options.Tokens.PasswordResetTokenProvider, "ResetPassword", token)){
        ViewBag.Message = this._localizer["tokenNotValid"].Value;
    }

    ...
}

查看UserManager代码:https://github.com/aspnet/Identity/blob/rel/2.0.0/src/Microsoft.Extensions.Identity.Core/UserManager.cs#L29 https://github.com/aspnet/Identity/blob/rel/2.0.0/src/Microsoft.Extensions.Identity.Core/UserManager.cs#L29

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查密码重置令牌是否已过期? 的相关文章

随机推荐

  • 无需 RStudio 将 Rmarkdown 转换为 PDF

    我想转换一个 Rmd记录为 PDFwithout rstudio questions tagged rstudio可用 目前的方法 当前的方法遵循以下步骤 Rmd文件被传递到knitr knit input report Rmd 得到的md
  • Firestore 安全规则仅允许特定字段[重复]

    这个问题在这里已经有答案了 我正在尝试实施安全规则来限制用户只能访问文档中的特定字段 我的数据结构是这样的 document name John dob 1994 email email protected cdn cgi l email
  • 拖放文件属性为只读

    我创建了一个附加属性 它注册拖放事件并请求操作 移动 链接 复制 UIElement dragablecontrol d as UIElement if dragablecontrol null dragablecontrol AllowD
  • 本机 int 类型和 numpy.int 类型有什么区别?

    您能否帮助理解本机 int 类型和 numpy int32 或 numpy int64 类型之间的主要区别 如果有 有几个主要区别 首先 Python 整数的大小是灵活的 至少在 Python 3 x 中 这意味着它们可以增长以容纳任意数量
  • 使用Java从网页中提取数据?

    我正在尝试用 Java 编写我的第一个程序 目标是编写一个程序来浏览网站并为我下载文件 但是 我不知道如何使用Java与互联网交互 谁能告诉我要查找 阅读哪些主题或推荐一些好的资源 最简单的解决方案 不依赖于任何第三方库或平台 是创建一个指
  • 自定义元素是否有效 HTML5?

    我一直无法找到自定义标签在 HTML5 中是否有效的明确答案 如下所示
  • Google Drive API 与 iOS 使用应用程序服务帐户

    我正在致力于实现一个 iOS 应用程序 该应用程序将从 Google Drive 文档中提取内容 该文档对于每个客户来说都是相同的 并且与用户的 Google 帐户完全分开 我按照教程观看了有关如何将 SDK 用于 Xcode 项目的视频
  • 在 C# 中检查字符串是否仅包含数字的最快方法

    我知道如何检查字符串是否仅包含数字的几种方法 RegEx int parse tryparse 循环等 谁能告诉我什么fastest检查方法是 我只需要CHECK值 无需实际解析它 我所说的 数字 特指 ASCII 数字 0 1 2 3 4
  • Magento - 使用更新 XML 删除块

    如何使用布局 xml 文件删除已存在的块 具体来说 我想从名为 top switches 的块中删除名为 currency 的块 它被插入到directory xml 文件中 如下所示
  • 使用 LINQ,如何从列表中查找具有给定属性值的对象?

    我有一堂课叫Questions This Questions有属性QuestionID and QuestionAnswer 迭代此过程时List of Question在 foreach 中 我必须找到 QuestionID 12 如果我
  • Sqlite C++ 中的预准备语句如何工作

    我不知道如何在我的 Sqlite3 代码中实现准备好的语句 include
  • C# pinvoke 封送联合

    我在将 C Union 转换为 C 时遇到一些问题 这是联盟的定义 union Info char varChar 8 short varShort 4 int varInteger 2 float varFloat 2 double va
  • 无法在 Kivy 中查看 tiff 图像

    problem 我可以使用以下命令加载图片Image kivy 中的模块 但由于某种原因 我无法将 tif 文件加载到 kivy 中 当图像源为 pics lugia png 图像加载得很好 但如果来源是 pics snorlax tif
  • java 字段变化监听器

    所以我真的想要某种方法来检测某个对象的场变化 我用谷歌搜索了很长一段时间但没有找到任何东西 所以基本上我需要知道的是对象的某些变量何时发生变化 让我们以这个类为例 public class Example String text test
  • GWT 开发者模式代码服务器

    GWT 开发人员模式嵌入式 http 服务器对我来说很有意义 但我承认我不明白 代码服务器 是什么 让我印象深刻的是 一个 html 文件包含了浏览器在开发过程中使用处理 AJAX 的嵌入式 Jetty 服务器呈现 GWT 应用程序所需的所
  • 在 AngularJS 中使用 ng-repeat 过滤结果 6 到 10(共 100 个)

    我看到limitTo文档中的过滤器 这允许我限制前 5 个或后 5 个结果 但我想设置限制的开始位置 以便我可以显示第二组 5 个结果 有内置过滤器吗 从 Angular 1 4 0 开始 limitTo filter https docs
  • 如何修改子字符串?

    使用排序规则xxx german2 ci它治疗 and ue相同 是否有可能出现所有M nchen突出显示如下 输入示例 M nchen can also be written as Muenchen 输出示例 b M nchen b ca
  • Git - 递归删除文件扩展名

    我试图递归地删除文件扩展名 但无论我尝试什么 它都会失败 谢谢你的任何想法 ubuntu ubuntu laptop hh hh sdk src uboot hh git rm r cached o fatal pathspec src u
  • DirectShow 与 Media Foundation 进行视频捕捉?

    我正在尝试在视频捕获 监控 流媒体应用程序的这两个 API 之间进行选择 但我不确定哪个是最佳选择 一些背景知识 我需要它与各种视频采集卡 适配器一起使用 该应用程序可能会用 C 开发 因此本机 API 至关重要 性能很重要 因为我需要处理
  • 如何检查密码重置令牌是否已过期?

    我正在使用 ASP NET Identity 并且具有基本的忘记密码 重置密码功能 当您填写忘记密码的表单时 它会使用以下命令创建一个重置令牌 userManager GeneratePasswordResetTokenAsync user