C# ASP.Net核心标识重置PasswordAsync失败:InvalidToken

C# ASP.Net核心标识重置PasswordAsync失败:InvalidToken,c#,asp.net-core,asp.net-identity,C#,Asp.net Core,Asp.net Identity,我正在尝试创建一个函数,该函数将在使用中被请求时重置用户密码。到目前为止,只要调用函数GeneratePasswordResetTokenAsync,它就会按预期返回令牌 // Generate Reset Token. var token = await userManager.GeneratePasswordResetTokenAsync(appIdentityUser); CfDJ8OHfQcgoimpKvwzwyqjhuwNuJOOwPXPw2F9wg5t7HNMc+YZbnJn1n8

我正在尝试创建一个函数,该函数将在使用中被请求时重置用户密码。

到目前为止,只要调用函数
GeneratePasswordResetTokenAsync
,它就会按预期返回令牌

// Generate Reset Token.
var token = await userManager.GeneratePasswordResetTokenAsync(appIdentityUser);
CfDJ8OHfQcgoimpKvwzwyqjhuwNuJOOwPXPw2F9wg5t7HNMc+YZbnJn1n8cVwBmq/yyyv4edv8wl+p6QHSOv/gtW6yat7iuD9v9dBqTmw+Lie2UY9MDLsMEu+gqwarruweh70foygqu1/tzk6mbvz8crplx2ktnjfvc73zg69puk58xrukzrwyqtgw/70asy6oh1gdj4g1qqqqqgqgqg1qqg1qqqg1v1v1v1v1v1v1v1v0gwgwgwgwgwgwgwwgwwwg3gw

出于测试目的,我现在在同一个方法中调用
ResetPasswordAsync
,查看密码是否会重置

注意
用户

// Find User.
AppIdentityUser user = await userManager.FindByEmailAsync(appIdentityUser.Email);

// Attempt To Reset The Password To someRealL0ngP@ssW0rd
IdentityResult resetPassword = await userManager.ResetPasswordAsync(user, token, "someRealL0ngP@ssW0rd");
不幸的是,我收到此错误
失败:InvalidToken

下面是启动文件中的
AddIdentity
,以及
DbContext

...
// Create The DbContext.
services.AddDbContext<AppIdentityDbContext>(options =>
{
    options.UseSqlServer(Configuration.GetConnectionString("AussieFoods2ULocal"));
});

// Identity User. Plus Password Complexity For Easy Testing.
services.AddIdentity<AppIdentityUser, IdentityRole>(options =>
{
    options.Password.RequireDigit = false;
    options.Password.RequiredLength = 5;
    options.Password.RequireNonAlphanumeric = false;
    options.Password.RequiredUniqueChars = 0;
    options.Password.RequireUppercase = false;
    options.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();

 // Paths For The Identity
 services.ConfigureApplicationCookie(options =>
 {
     options.LoginPath = "/Security/SignIn";
     options.AccessDeniedPath = "/Security/AccessDenided";
 });
    
 services.Configure<DataProtectionTokenProviderOptions>(options =>
 {
      options.TokenLifespan = TimeSpan.FromHours(2);
 });

 services.AddAuthentication();
 ...

您可以创建一个自定义令牌提供程序来生成如下所示的
PasswordResetToken

public class ResetPasswordTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class
{
    public ResetPasswordTokenProvider(IDataProtectionProvider dataProtectionProvider,
        IOptions<ResetPasswordTokenProviderOptions> options)
        : base(dataProtectionProvider, options)
    {
    }
}
public class ResetPasswordTokenProviderOptions : DataProtectionTokenProviderOptions
{
    public ResetPasswordTokenProviderOptions()
    {
        Name = "ResetPasswordDataProtectorTokenProvider";
        TokenLifespan = TimeSpan.FromDays(1);
    }
}

为了测试Startup.cs配置,我很快创建了一个新项目。
ConfigureServices
与您的
services.addcontrollerswithview()相同在末尾,并且
配置
如下所示

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}
然后我创建了一个操作来创建一个用户并重置密码。下面是重置密码的操作

public async Task ResetPassword()
{
    var user = await UserManager.FindByEmailAsync("your-email-address@domain.com");
    var token = await UserManager.GeneratePasswordResetTokenAsync(user);
    var result = await UserManager.ResetPasswordAsync(user, token, Guid.NewGuid().ToString());
}

这将返回一个成功的结果。

既然已经有了
appIdentityUser
,为什么还要使用
FindByEmailAsync
user
appIdentityUser
不一样吗?我之所以调用它,是因为调用ResetPasswordAsync时缺少userid
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}
public async Task ResetPassword()
{
    var user = await UserManager.FindByEmailAsync("your-email-address@domain.com");
    var token = await UserManager.GeneratePasswordResetTokenAsync(user);
    var result = await UserManager.ResetPasswordAsync(user, token, Guid.NewGuid().ToString());
}