按照标题,我试图设置一个简单的ASP.NET Core 2.2 Web API项目(因此与MVC Razor页面或UI无关)。
我一直在遵循本Microsoft指南Account confirmation and password recovery in ASP.NET Core,但显然适用于我的Web API项目,该项目由以下四个端点组成:
名称是不言自明的,前两个端点用于创建用户,使用SendGrid发送电子邮件,然后第二个端点用于验证确认令牌并确认用户帐户。
到目前为止,一切正常,令牌可以正确验证,并且AspNetUser表行字段EmailConfirmed
设置为true(1)。抱歉,我已经使用实体框架迁移(Add-Migration
命令)来整理与AspNetUser相关的表。
现在,第三和第四端点处理用户请求密码重置令牌然后用于重置其密码的情况,因此端点编号3 PasswordResetEmailAsync
重用与ConfirmEmailAsync
端点相同的代码,首先进行验证用户使用UserManager.FindByNameAsync
方法存在,然后将此ApplicationUser
类型的对象(源自IdentityUser
)传递到FindByNameAsync
方法中,然后该方法访问后备存储并将用户拉出较早创建(按预期工作):
var result = await _userManager
.ResetPasswordAsync(user, token, theNewPassword)
.ConfigureAwait(false);
这总是返回以下内容(为此使用的Object Exporter加载项):
{
"Errors":
[
{
"Code": "InvalidToken",
"Description": "Invalid token."
}
],
"Succeeded": false,
"_errors":
}
从上面的JSON代码段中可以看到,令牌被视为无效,但是当我将生成的令牌与传递到ResetPasswordAsync端点的令牌进行比较时,令牌是相同的:
CfDJ8NKO7RlW/idPs+/v0VVN8vv99DYu3b4zYHddSIlvUBHjcThOMG85zegMIJ6AUpQJXpC0Ouk0QW8hVVDIRUgT7u0TnUU+kJePskU2UMRaul0NtddoeJ30LsOe62K8lMqm9OyC8+CsU9nZZFKIWRDoJxnGCAJiznVukulFX9BxAhnFN+ocOHZBEwIVw9w/86wJRI1WKegiemcgWmepEZalBzU8bWHQHzKbHd4aIfahfK4OVcYNwPo0K1+5ypE4Jx1Mpg==
使用WebUtility.UrlEncode
方法生成重置令牌电子邮件时,将清理上述密码,并使用ResetPasswordAsync
在WebUtility.UrlDecode
端点中将其解密。
我使用KDiff3确认两个令牌字符串相同,并且AspNetUser表中只有一个用户,但是令牌始终无效,并且重置密码过程失败。
StartUp.cs类没什么特别的,看起来像上面提到的上述教程中提供的示例,关键是我在启动时添加了身份提供程序:
services.AddDefaultIdentity<ApplicationUser>(config =>
{
config.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<AuthContext>();
这让我发疯,对于使用Web API项目,我对ASP.NET Core 2.2 Identity失去了信心。我为什么要这样呢?世界其他地方不使用MVC或Razor Pages,在这个时代,一切都变得毫无头绪,前端(无论是React,Angular等)消耗了端点,另一个原因是我在构建大量的位于Azure应用程序网关后面的微服务。
谢谢。