IUserTokenProvider с именем «По умолчанию» не зарегистрирован - PullRequest
0 голосов
/ 14 ноября 2018

Я использую ASPNET Core API, где мы проводим нашу аутентификацию.Все работает нормально, за исключением того факта, что он жалуется на отсутствие IUserTokenprovider всякий раз, когда я пытаюсь изменить пароль с помощью GeneratePasswordResetToken .Мы получаем сообщение об ошибке: «IUserTokenProvider с именем« Default »не зарегистрирован».

Мы используем разные базы данных для разных клиентов, поэтому мы хотим предоставить строку подключения к контексту, чтобы каждый вызов могобратитесь к другой базе данных.Насколько я понимаю, это невозможно, когда вы делаете это при запуске.Затем мы попытались сделать это в DbContext и UserManager, который работает.

Наш код теперь выглядит следующим образом (только соответствующие части):

Запуск

 public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddIdentity<ApplicationUser, IdentityRole>(options => 
        {
            options.Tokens.ProviderMap.Add("Default", new TokenProviderDescriptor(typeof(IUserTwoFactorTokenProvider<ApplicationUser>)));
        })
            .AddDefaultTokenProviders();
     }

DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
private static string _connectionString

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, string connectionString) : base (options)
    {
        _connectionString = connectionString;

    }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_connectionString);
        base.OnConfiguring(optionsBuilder);
    }
}

UserManager

public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(string connectionString, ApplicationDbContext context) : base(new UserStore<ApplicationUser>(context), null, new PasswordHasher<ApplicationUser>(), null, null, null, new IdentityErrorDescriber(), null, new Logger<UserManager<ApplicationUser>>(new LoggerFactory()))
    {                
        this.Options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultProvider;
        this.Options.Tokens.ProviderMap.Add("Default", new TokenProviderDescriptor(typeof(IUserTwoFactorTokenProvider<ApplicationUser>)));
    }
}

Контроллер

public async Task<string> ChangePasswordAsync(string userName, string oldPassword, string newPassword)
    {
         var connectionString = _tenant.DireXtionDatabase.GetConnectionString();
          ApplicationDbContext applicationContext = new ApplicationDbContext(new DbContextOptions<ApplicationDbContext>(), connectionString);
          var manager = new ApplicationUserManager(connectionString, applicationContext);
          user = await manager.FindByNameAsync(userName);
          var token = await manager.GeneratePasswordResetTokenAsync(user);
          var result = await manager.ResetPasswordAsync(user, token, newPassword);
    }

Я уже понял, что IUserToken следует заменить на IUserTwoFactorTokenProvider для Core, так как он не существует в Core.

Поскольку он не работает, я также попытался добавить его в автозагрузку, но, по-видимому, это неНа самом деле это не так.

Есть много полезного контента, но пока что ни один из них не работает для меня, вероятно, потому что мы не используем DI по умолчанию при запуске.

Когда я перехожу через код, я вижу, что у Options.Tokens есть PasswordResetTokenProvider, а также маршрут провайдера по умолчанию.Но когда я достигаю GeneratePasswordTokenAsync, я все равно получаю это сообщение об ошибке.

Кто-нибудь знает, почему я все еще получаю это сообщение?Или что я делаю не так?

...