ASP.NET核心中的密码重置令牌提供程序 - 找不到IUserTokenProvider

rud*_*ias 2 c# asp.net-identity-3 asp.net-core asp.net-core-webapi

你好,

我用google搜索过,但是有一百个来自ASP.NET的例子,但没有关于ASP.NET Core的内容.

为了获得密码重置工作,我需要在DI中注册一个IUserTokenProvider实例.

没有它,我会在以下行获得例外:

var result = await _userManager.ResetPasswordAsync(user, token, password);
Run Code Online (Sandbox Code Playgroud)

例外

"No IUserTokenProvider named 'PasswordResetTokenProvider' is registered."
Run Code Online (Sandbox Code Playgroud)

这是有道理的,所以我试着在DI中注册它:

services.AddSingleton<IUserTokenProvider<User>, DataProtectorTokenProvider<User>>();
Run Code Online (Sandbox Code Playgroud)

但是界面IUserTokenProvider不存在.我Microsoft.AspNetCore.Identity在文件中使用.它甚至不存在于项目gitlab中.

好吧,在挖掘了身份源代码后,我发现了一个类似的界面IUserTwoFactorTokenProvider<T>.让我们改用它:

services.AddSingleton<IUserTwoFactorTokenProvider<User>, DataProtectorTokenProvider<User>>();
Run Code Online (Sandbox Code Playgroud)

......没有运气


TL; DR:

请 - 如何在ASP.NET Core中重置密码?充其量只是一些例子.

先感谢您.

Jer*_*man 11

您可以指定其中一个内置提供程序;

services.AddIdentity<User, Role>(options =>{
        options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
    })
    .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

或者创建自己的IUserTwoFactorTokenProvider并像这样注册它;

services.AddIdentity<User, Role>(options => {
    options.Tokens.PasswordResetTokenProvider = nameof(MyTokenProvider);
})
.AddTokenProvider<MyTokenProvider>(nameof(MyTokenProvider));
Run Code Online (Sandbox Code Playgroud)


小智 9

在 startup.cs 中添加或更正以下几行:

services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到更多描述


rud*_*ias 5

我不确定这是解决方法还是常规方法,但是该IUserTwoFactorTokenProvider界面似乎是正确的方法。IUserTokenProvider似乎不再存在。

弄清楚我必须以身份手动注册提供者:

services.AddIdentity<User, Role>(options =>
            {
                ...
                options.Tokens.ProviderMap.Add("Default", new TokenProviderDescriptor(typeof(IUserTwoFactorTokenProvider<User>)));
            })
Run Code Online (Sandbox Code Playgroud)

和可选配置ConfigureServices

services.Configure<DataProtectionTokenProviderOptions>(o =>
        {
            o.Name = "Default";
            o.TokenLifespan = TimeSpan.FromHours(1);
        });
Run Code Online (Sandbox Code Playgroud)

密码重置/电子邮件验证令牌现在可以使用。

PS:打开了一个需要澄清的问题


小智 5

您必须深入挖掘 .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>>();
Run Code Online (Sandbox Code Playgroud)