c# - 如何获取 userManager.VerifyUserTokenAsync 的目的字段?

标签 c# .net-core asp.net-identity reset-password usermanager

当我尝试重置密码时,我正在使用 userManager.VerifyUserTokenAsync(user, tokenProvider, purpose, token) 但它总是返回 false。我怀疑 purpose 字段是错误的,但我不确定那里应该放什么。 我的问题是,如何获得 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 source code 中所见,定义了 3 个“ token 用途”常量供您在 User Manager 类上使用.

在您的特定用例中,您可能希望这样做:

//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 类是通用的,您必须编写一些丑陋的代码来访问常量。也许在未来,Microsoft 可以添加一个非通用父类,如所述 here , 使访问目的常量更加优雅。

关于c# - 如何获取 userManager.VerifyUserTokenAsync 的目的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61687836/

相关文章:

asp.net - SignalR ASP.NET MVC5 标识

c# - 如何获取集合的子集以计算集合中某些值的最小值、最大值和平均值

c# - 强制 C# 异步任务懒惰?

c# - 重命名 ASP.NET Identity 表时出现重复的外键

c# - -在 Scaffold-DbContext 中无法识别命名空间选项

entity-framework - .NET Core/EF Core (SQL) 使用(托管)后台服务时的最大池问题

asp.net - Web API 外部承载未经授权

c# - 区分 machine.config 和 web.config 中的 ConnectionString

c# - Winforms WPF 互操作性能

c# - EF6 CodeFirst 我的 [Key] Id 列不会像标识列那样自动递增