- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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
,就是我们要找的。它使用数据保护来序列化/加密这些 token 。
DataProtectorTokenProvider
内,它的保护者是
default to the name of "DataProtectorTokenProvider" .
GenerateAsync()
内部方法
DataProtectorTokenProvider
,你可以告诉 token 包括:
DateTimeOffset.UtcNow
) userId
userId
从 token 中,您需要进行逆向工程:
userId
DataProtector
用于生成那些 token !
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();
...
}
}
...
}
}
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/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!