![](/img/trans.png)
[英]Microsoft.AspNetCore.Identity.UserManager: Warning: VerifyUserTokenAsync() failed with purpose: ResetPassword for user
[英]How to get purpose field for userManager.VerifyUserTokenAsync?
当我尝试重置密码时,我正在使用userManager.VerifyUserTokenAsync(user, tokenProvider, purpose, token)
但它总是返回 false。 我怀疑purpose
字段是错误的,但我不确定 go 实际上应该是什么。 我的问题是,我如何获得purpose
领域? 从我看到的一些示例中,人们将其设置为“ResetPassword”。 这是正确的还是我错过了什么?
谢谢!
启动.cs
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.Password.RequiredLength = 6;
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Password.RequireNonAlphanumeric = false;
options.User.RequireUniqueEmail = true;
options.SignIn.RequireConfirmedAccount = true;
options.SignIn.RequireConfirmedEmail = true;
options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
options.Tokens.EmailConfirmationTokenProvider = "emailconfirmation";
})
.AddEntityFrameworkStores<VisualDbContext>()
.AddDefaultTokenProviders()
.AddTokenProvider<EmailConfirmationTokenProvider<ApplicationUser>>("emailconfirmation");
services.Configure<DataProtectionTokenProviderOptions>(opt =>
opt.TokenLifespan = TimeSpan.FromHours(2));
services.Configure<EmailConfirmationTokenProviderOptions>(opt =>
opt.TokenLifespan = TimeSpan.FromDays(3));
// Forgot Password
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var encodedToken = HttpUtility.UrlEncode(token);
//Verify Reset Token
var purpose = "WHAT GOES HERE?";
var result = await _userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultEmailProvider, purpose, token);
谢谢
正如您在 UserManager 源代码中所见,定义了 3 个“令牌目的”常量供您在用户管理器 class 上使用。
在您的特定用例中,您可能希望这样做:
//Replace TUser with your user type
var purpose = UserManager<TUser>.ResetPasswordTokenPurpose;
var result = await _userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultEmailProvider, purpose, token);
或者你可以这样做:
var purpose = UserManager<object>.ResetPasswordTokenPurpose;
不幸的是,因为 UserManager class 是通用的,所以您必须编写一些难看的代码才能访问这些常量。 也许在未来,微软可以添加一个非通用父 class ,如此处所述,以使访问目的常量更加优雅。
在我们的团队中,我们使用类似的东西
private UserManager<{YourUserClass}> _userManager;
public async Task<IActionResult> CheckResetPasswordToken([FromBody] CheckResetPasswordTokenRequestModel model)
{
var user = await _userManager.FindByEmailAsync(model.Email);
var token = HttpUtility.UrlDecode(model.Token).Replace(" ", "+");
return Json(new JsonResponse<CheckResetPasswordTokenResponseModel>(new CheckResetPasswordTokenResponseModel
{
IsValid = await _userManager.VerifyUserTokenAsync(user, _userManager.Options.Tokens.PasswordResetTokenProvider, "ResetPassword", token)
}));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.