【问题标题】:How to validate that user token is valid before reset password in Asp.Net Core MVC?如何在 Asp.Net Core MVC 中重置密码之前验证用户令牌是否有效?
【发布时间】:2020-01-03 09:09:24
【问题描述】:

我正在为我的应用程序使用 Asp.net 核心 MVC,并且我实现了重置密码功能,它工作正常。让我展示一下它是如何实现的。当用户请求重置密码时,应用程序会创建一个令牌,如下所示:

var token = _userManager.GeneratePasswordResetToken(user);

应用程序向用户发送一封电子邮件,当用户点击链接时,它会出现在用户重置密码的页面上。我正在重置如下:

ChangePasswordAsync(user, token, password);

它工作正常。但我想在更改密码之前验证令牌是否有效。有什么办法吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-core asp.net-identity


    【解决方案1】:

    UserManager 有一个公共方法VerifyUserTokenAsync,这很可能是您所追求的。如果你检查源代码here,你会看到它是如何在ResetPasswordAsync内部使用的:

    VerifyUserTokenAsync(user, Options.Tokens.PasswordResetTokenProvider, ResetPasswordTokenPurpose, token)
    

    因此,它依赖于一个魔术字符串,但您应该能够使用相同的值来获取真值或假值,例如:

    if(await _userManager.VerifyUserTokenAsync(user, _userManager.Options.Tokens.PasswordResetTokenProvider, "ResetPassword", token))
    {
        await _userManager.ResetPasswordAsync(user, token, password);
    }
    else
    {
        // handle a bad token however you see fit...
    }
    

    这个未经测试,所以我不能保证它会按原样工作。

    【讨论】:

    • 这对我有帮助,这正是我想要的。但是,即使复制粘贴令牌,我每次都会得到 False。
    • 啊,好吧,我想通了。创建 ConfirmMail 令牌时,需要对其进行编码,但是,在创建 PasswordReset 令牌时,您不应对其进行编码。有点好笑,但是很好
    【解决方案2】:

    令牌将由身份框架验证。所以我想您不需要手动执行此操作。

    var result = await _userManager.ResetPasswordAsync(user, token, newPassword);
    

    如果失败,结果将有描述性消息。

    干杯,

    【讨论】:

    • 我知道。我已经在做。但我想手动验证它,因为如果令牌无效,我想不显示重置页面并重定向到 404。
    • 它在设计上不是这样工作的。如果你能得到可靠的失败响应,那么你可以暴力破解一个有效的令牌,只需生成随机令牌并将它们扔到你的服务器上,直到不再返回 404。通过在所有情况下返回密码重置,它变得更具挑战性。
    猜你喜欢
    • 2020-12-15
    • 2020-09-04
    • 2020-05-04
    • 1970-01-01
    • 2018-06-01
    • 2020-07-12
    • 2023-04-10
    • 2019-10-07
    • 2017-08-12
    相关资源
    最近更新 更多