3

当我尝试重置密码时,我正在使用userManager.VerifyUserTokenAsync(user, tokenProvider, purpose, token)但它总是返回错误。我怀疑该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);

谢谢

4

1 回答 1

4

正如您在 UserManager源代码中看到的那样,定义了 3 个“令牌目的”常量供您在 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 类是通用的,所以您必须编写一些难看的代码来访问这些常量。也许在未来,微软可以添加一个非泛型父类,如此处所述以使访问目的常量更加优雅。

于 2020-11-13T18:25:00.607 回答