gpt4 book ai didi

c# - 如何从 ASP.NET Core 中的密码重置 token 中检索用户?

转载 作者:行者123 更新时间:2023-12-04 00:01:59 25 4
gpt4 key购买 nike

我有一个 ASP.NET Core 2.1 Web 应用程序,并且正在添加忘记密码功能。我看过几个例子,他们似乎采取了两种方法之一。第一种方法是在密码重置 URL 中包含用户 ID 或用户的电子邮件以及密码重置 token 。第二种方法是在密码重置 url 中仅包含密码重置 token ,然后在尝试更改密码 (Binary Intellect example) 时要求用户输入识别信息(例如电子邮件)。有没有办法在只给出密码重置 token 的情况下查找用户?

我的团队负责人要求我只传递密码重置 url 中的 token ,然后查找用户。我最初的研究让我相信我必须手动记录用户 ID 和 token 关系,但我希望有一些内置的东西。我已经查看了 ASP.NET Core UserManager documentation ,但没有找到任何方法来检索给定 token 的用户。

以下是在密码重置 URL (Microsoft Password Recovery Doc) 中嵌入用户 ID 的一些示例代码:

var code = await _userManager.GeneratePasswordResetTokenAsync(user);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);

最佳答案

有一种方法可以获得 UserId来自密码重置 token ,但在我看来,这很棘手,而且工作量很大。

什么是默认值

如果你有一些类似下面的代码,

services.AddIdentity<AppUser, AppRole>(options =>
{
...
}
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();


最后一行 .AddDefaultTokenProviders() adds 4 default token providers ,用于生成用于重置密码、更改电子邮件和更改电话号码选项的 token ,以及用于生成两因素身份验证 token ,进入管道:
  • DataProtectorTokenProvider
  • PhoneNumberTokenProvider
  • EmailTokenProvider
  • AuthenticatorTokenProvider

  • 第一个, DataProtectorTokenProvider ,就是我们要找的。它使用数据保护来序列化/加密这些 token 。

    DataProtectorTokenProvider 内,它的保护者是 default to the name of "DataProtectorTokenProvider" .

    token 是如何生成的

    如果你看 GenerateAsync() 内部方法 DataProtectorTokenProvider ,你可以告诉 token 包括:
  • token 创建的 Utc 时间戳 ( DateTimeOffset.UtcNow )
  • userId
  • 目的字符串
  • 安全标记,如果支持

  • generate 方法将所有这些连接起来,将它们转换为字节数组,并调用内部的保护器来保护/加密有效负载。最后,payload 被转换为 base 64 字符串。

    如何获取用户 ID

    获取 userId从 token 中,您需要进行逆向工程:
  • 将 token 从 base 64 字符串转换回字节数组
  • 调用里面的保护器来取消保护/解密字节数组
  • 读取 Utc 时间戳
  • 阅读 userId

  • 这里棘手的部分是如何获得相同的 DataProtector用于生成那些 token !

    如何获取默认 Data Protector

    由于默认 DataProtectorTokenProvider被注入(inject)管道,我能想到的唯一方法是得到相同的 DataProtector是使用默认的 DataProtectorTokenProvider 创建一个保护器相同默认名称,“DataProtectorTokenProvider”,用于生成 token !

    public class GetResetPasswordViewModelHandler : IRequestHandler<...>
    {
    ...
    private readonly IDataProtector _dataProtector;

    public GetResetPasswordViewModelHandler(...,
    IDataProtectionProvider dataProtectionProvider)
    {
    ...
    _dataProtector = dataProtectionProvider.CreateProtector("DataProtectorTokenProvider");
    // OR
    // dataProtectionProvider.CreateProtector(new DataProtectionTokenProviderOptions().Name);
    }

    public async Task<ResetPasswordViewModel> Handle(GetResetPasswordViewModel query, ...)
    {
    // The password reset token comes from query.ResetToken
    var resetTokenArray = Convert.FromBase64String(query.ResetToken);

    var unprotectedResetTokenArray = _dataProtector.Unprotect(resetTokenArray);

    using (var ms = new MemoryStream(unprotectedResetTokenArray))
    {
    using (var reader = new BinaryReader(ms))
    {
    // Read off the creation UTC timestamp
    reader.ReadInt64();

    // Then you can read the userId!
    var userId = reader.ReadString();

    ...
    }
    }

    ...
    }
    }

    截图:
    enter image description here

    我的 2 美分

    尝试阅读 userId 似乎工作量很大关闭密码重置 token 。我了解您的团队负责人可能不想在密码重置链接上公开用户 ID,或者(s)他认为这是多余的,因为重置 token 具有 userId .

    如果您使用整数来表示 userId并且不想将其公开,我会将其更改为 GUID .

    如果您必须使用整数作为 userId ,我只需在用户个人资料(我称之为 PublicToken)中创建一个 unique_identifier 类型的列,并使用它来识别所有公共(public)事务的用户。

    var callbackUrl = Url.Action("resetPassword", "account", new
    {
    area = "",
    rt = passwordResetToken, // reset token
    ut = appUser.Id // user token, use GUID user id or appUser.PublicToken
    }, protocol: Request.Scheme);

    关于c# - 如何从 ASP.NET Core 中的密码重置 token 中检索用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793835/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com