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());
}