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

本文关键字:程序 IUserTokenProvider 找不到 令牌 核心 NET 密码 ASP | 更新日期: 2023-09-27 18:16:43

你好,

为了进行密码重置工作,我需要在DI中注册一个IUserTokenProvider实例。

如果没有它,我会在以下行出现异常:

var result = await _userManager.ResetPasswordAsync(user, token, password);
"No IUserTokenProvider named 'PasswordResetTokenProvider' is registered."

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

services.AddSingleton<IUserTokenProvider<User>, DataProtectorTokenProvider<User>>();

但是接口IUserTokenProvider不存在。你知道怎么解决这个问题吗?

感谢

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

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

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));

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

services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

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

我不确定这是变通方法还是普通方法,但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:打开一个问题进行澄清

您必须深入研究.NET核心代码,并找到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>>();

在startupclass的ConfigureServices((方法中添加.AddDefaultTokenProviders();

 `in public void ConfigureServices(IServiceCollection services)
    {
     services.AddIdentity<RegisterUser, IdentityRole>()
                    .AddEntityFrameworkStores<ContextClass>()
                    .AddDefaultTokenProviders();
    }
    `
        services.AddIdentityCore<User>()
        .AddEntityFrameworkStores<ContextClass>()
        .AddDefaultTokenProviders();

它是AddIdentityCore版本,只适用于您添加User,您可能需要它。