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

时间:2016-11-06 04:26:19

标签: c# asp.net-core asp.net-identity-3 asp.net-core-webapi

您好,

我彻底搜索了一下,但是有一百个来自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 核心中重置密码?充其量只是一些例子。

提前谢谢。

6 个答案:

答案 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);
        });

密码重置/电子邮件验证令牌现在正在运行。

PS:Opened an issue for clarification

答案 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 版本,只有您添加用户,您可能需要它。