【问题标题】:Password reset token provider in ASP.NET core - IUserTokenProvider not foundASP.NET 核心中的密码重置令牌提供程序 - 找不到 IUserTokenProvider
【发布时间】: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不存在。你知道如何解决这个问题吗?

谢谢

【问题讨论】:

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


    【解决方案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版本,只有你添加用户,你可能需要它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-06-02
              • 2020-02-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-03
              • 2015-04-28
              相关资源
              最近更新 更多