ASP.NET 核心中的密码重置令牌提供程序 - 找不到 IUserTokenProvider
Posted
技术标签:
【中文标题】ASP.NET 核心中的密码重置令牌提供程序 - 找不到 IUserTokenProvider【英文标题】:Password reset token provider in ASP.NET core - IUserTokenProvider not found 【发布时间】:2017-03-19 15:55:06 【问题描述】:你好,
为了进行密码重置工作,我需要在 DI 中注册一个 IUserTokenProvider 实例。
如果没有它,我会在以下行出现异常:
var result = await _userManager.ResetPasswordAsync(user, token, password);
"No IUserTokenProvider named 'PasswordResetTokenProvider' is registered."
这是有道理的,所以我尝试在 DI 中注册它:
services.AddSingleton<IUserTokenProvider<User>, DataProtectorTokenProvider<User>>();
但是接口IUserTokenProvider
不存在。你知道如何解决这个问题吗?
谢谢
【问题讨论】:
【参考方案1】:您可以指定内置提供程序之一;
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));
【讨论】:
我需要的是空字符串而不是令牌【参考方案2】:在 startup.cs 中添加或更正以下行:
services.AddIdentity<User, UserRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
你可以找到更多描述here
【讨论】:
【参考方案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);
);
密码重置/电子邮件验证令牌现在正在工作。
PS:Opened an issue for clarification
【讨论】:
【参考方案4】:您必须深入挖掘 .NET Core 代码并找出 AddIdentity
的内部结构。
我发现以下内容对我们有用,因为我们无法使用 .AddIdentity()
,因为它覆盖了 IdentityServer4 中间件。
相反,我们为 UserManager 所需的所有接口添加了瞬态,然后使用 IdentityBuilder 类添加令牌提供者。
注意下面的 User 类继承自 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>>();
【讨论】:
【参考方案5】:在startupclass的ConfigureServices()方法中添加.AddDefaultTokenProviders();
`in public void ConfigureServices(IServiceCollection services)
services.AddIdentity<RegisterUser, IdentityRole>()
.AddEntityFrameworkStores<ContextClass>()
.AddDefaultTokenProviders();
`
【讨论】:
【参考方案6】: services.AddIdentityCore<User>()
.AddEntityFrameworkStores<ContextClass>()
.AddDefaultTokenProviders();
这是AddIdentityCore版本,只有你添加用户,你可能需要它。
【讨论】:
以上是关于ASP.NET 核心中的密码重置令牌提供程序 - 找不到 IUserTokenProvider的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 2.2 - 密码重置在 Azure 上不起作用(无效令牌)
ASP.NET CORE Identity DataProtectionTokenProviderOptions 密码重置令牌无效