您好,
我彻底搜索了一下,但是有一百个来自ASP.NET的例子,但没有关于ASP.NET Core。
为了获得密码重置工作,我需要在DI中注册一个IUserTokenProvider实例。
没有它,我会在以下行获得例外:
var result = await _userManager.ResetPasswordAsync(user, token, password);
异常
"No IUserTokenProvider named 'PasswordResetTokenProvider' is registered."
这是有道理的,所以我试着在DI中注册它:
services.AddSingleton<IUserTokenProvider<User>, DataProtectorTokenProvider<User>>();
但是接口IUserTokenProvider
不存在。我在文件中使用Microsoft.AspNetCore.Identity
。它甚至不存在于项目gitlab中。
好了,在深入了解身份源代码后,我发现了一个类似的接口IUserTwoFactorTokenProvider<T>
。让我们改用它:
services.AddSingleton<IUserTwoFactorTokenProvider<User>, DataProtectorTokenProvider<User>>();
......没有运气。
TL; DR:
请 - 如何在ASP.NET 核心中重置密码?充其量只是一些例子。
提前谢谢。
答案 0 :(得分:8)
您可以指定其中一个内置提供商;
services.AddIdentity<User, Role>(options =>{
options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
})
.AddDefaultTokenProviders();
或者创建自己的IUserTwoFactorTokenProvider并像这样注册;
services.AddIdentity<User, Role>(options => {
options.Tokens.PasswordResetTokenProvider = nameof(MyTokenProvider);
})
.AddTokenProvider<MyTokenProvider>(nameof(MyTokenProvider));
答案 1 :(得分:3)
我不确定它是解决方法还是正常方法,但IUserTwoFactorTokenProvider
界面似乎是正确的方法。 IUserTokenProvider似乎不再存在。
想出我必须在身份中手动注册提供者:
services.AddIdentity<User, Role>(options =>
{
...
options.Tokens.ProviderMap.Add("Default", new TokenProviderDescriptor(typeof(IUserTwoFactorTokenProvider<User>)));
})
ConfigureServices
中的可选配置:
services.Configure<DataProtectionTokenProviderOptions>(o =>
{
o.Name = "Default";
o.TokenLifespan = TimeSpan.FromHours(1);
});
密码重置/电子邮件验证令牌现在正在运行。
答案 2 :(得分:1)
您必须深入研究.NET Core代码并找到AddIdentity
正在做的内部。
我发现以下内容对我们有用,因为我们无法使用.AddIdentity()
覆盖IdentityServer4中间件。
相反,我们为UserManager所需的所有接口添加了瞬态,然后使用IdentityBuilder类添加令牌提供程序。
注意以下用户类继承自IdentityUser
,因为我们需要自定义用户表。
// add User Manager related objects into DI configuration
services.AddTransient<IUserStore<User>, UserStore<User, IdentityRole<string>, ApplicationDbContext>>();
services.AddTransient<IRoleStore<IdentityRole<string>>, RoleStore<IdentityRole<string>, ApplicationDbContext>>();
services.AddTransient<IPasswordHasher<User>, PasswordHasher<User>>();
services.AddTransient<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.AddTransient<IdentityErrorDescriber>();
var identityBuilder = new IdentityBuilder(typeof(User), typeof(IdentityRole<string>), services);
identityBuilder.AddTokenProvider("Default", typeof(DataProtectorTokenProvider<User>));
services.AddTransient<UserManager<User>>();
答案 3 :(得分:1)
在startup.cs中添加或更正以下行:
services.AddIdentity<User, UserRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
您可以找到更多说明here
答案 4 :(得分:1)
在启动类的ConfigureServices()方法中添加.AddDefaultTokenProviders();
`in public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<RegisterUser, IdentityRole>()
.AddEntityFrameworkStores<ContextClass>()
.AddDefaultTokenProviders();
}
`
答案 5 :(得分:0)
services.AddIdentityCore<User>()
.AddEntityFrameworkStores<ContextClass>()
.AddDefaultTokenProviders();
它是 AddIdentityCore 版本,只有您添加用户,您可能需要它。