在ASP.NET Identity Core中,当在Web Farm上重置密码时出现无效令牌的问题可能是由于令牌无法在不同服务器之间共享导致的。要解决这个问题,可以使用分布式缓存来存储令牌,并确保所有服务器都可以访问该缓存。
以下是一个示例解决方案,使用ASP.NET Core Identity和Redis作为分布式缓存:
首先,确保已安装了Microsoft.Extensions.Caching.StackExchangeRedis
和StackExchange.Redis
NuGet包。
在Startup.cs文件中的ConfigureServices方法中添加以下代码:
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
services.AddIdentity()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores();
services.Configure(options =>
{
options.TokenLifespan = TimeSpan.FromHours(3); // 设置令牌过期时间
});
// ...
app.UseAuthentication();
// ...
UserManager.GeneratePasswordResetTokenAsync
方法生成令牌,然后通过邮件或其他方式发送给用户。var user = await _userManager.FindByEmailAsync(email);
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
UserManager.ResetPasswordAsync
方法来重置密码。var user = await _userManager.FindByEmailAsync(email);
var result = await _userManager.ResetPasswordAsync(user, token, newPassword);
通过使用分布式缓存,令牌将在所有服务器之间共享,从而解决了在Web Farm上重置密码时出现无效令牌的问题。