Альтернатива DpapiDataProtectionProvider в Net Core 3.1 - PullRequest
1 голос
/ 11 января 2020

Я перемещаю Asp Net. Net Framekwork в Asp Net Core 3. Для сброса пароля я использовал:

var provider = new DpapiDataProtectionProvider("Sample");
UserManager.UserTokenProvider = new DataProtectorTokenProvider<MyUser, int>(
             provider.Create("EmailConfirmation"));

DpapiDataProtectionProvider недоступен в новая среда. Какие альтернативы я могу использовать?

1 Ответ

0 голосов
/ 12 января 2020

Сначала вам нужно создать собственных провайдеров защиты данных, таких как

public class CustomEmailConfirmationTokenProvider<TUser> : 
                             DataProtectorTokenProvider<TUser> where TUser : class  
{       
      public CustomEmailConfirmationTokenProvider(
                  IDataProtectionProvider dataProtectionProvider,            
                  IOptions<EmailConfirmationTokenProviderOptions> options,           
                  ILogger<DataProtectorTokenProvider<TUser>> logger) : base(dataProtectionProvider, options, logger)        
      {         

      }     

}

public class EmailConfirmationTokenProviderOptions : 
                     DataProtectionTokenProviderOptions     
{       
      public EmailConfirmationTokenProviderOptions()        
      {             
             Name = "EmailConfirmationDataProtectorTokenProvider";           
             TokenLifespan = TimeSpan.FromDays(7);      
      }     
}

    public class CustomPasswordResetTokenProvider<TUser> : 
                     DataProtectorTokenProvider<TUser> where TUser : class  
   {        
          public CustomPasswordResetTokenProvider(          
                IDataProtectionProvider dataProtectionProvider,              
                IOptions<PasswordResetTokenProviderOptions> options,             
                ILogger<DataProtectorTokenProvider<TUser>> logger) : base(dataProtectionProvider, options, logger)      
          {

          }     
}

public class PasswordResetTokenProviderOptions : DataProtectionTokenProviderOptions      
{       
         public PasswordResetTokenProviderOptions()         
         {          
                  Name = "PasswordResetDataProtectorTokenProvider";              
                  TokenLifespan = TimeSpan.FromDays(1);         
         } 
}

Startup.cs

services.AddIdentityCore<ApplicationUser>(options =>            {
                options.Password.RequireDigit = true;
                options.Password.RequiredLength = 6;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase = false;
                options.Password.RequireLowercase = false;
            options.Tokens.ProviderMap.Add("CustomEmailConfirmation", new TokenProviderDescriptor(typeof(CustomEmailConfirmationTokenProvider<ApplicationUser>)));
            options.Tokens.EmailConfirmationTokenProvider = "CustomEmailConfirmation";

            options.Tokens.ProviderMap.Add("CustomPasswordReset", new TokenProviderDescriptor(typeof(CustomPasswordResetTokenProvider<ApplicationUser>)));
            options.Tokens.PasswordResetTokenProvider = "CustomPasswordReset";

            options.SignIn.RequireConfirmedEmail = true;            })  
    .AddRoles<ApplicationRole>()

        services.AddTransient(o =>
        {
            var service = new CustomEmailConfirmationTokenProvider<ApplicationUser>(
                o.GetService<IDataProtectionProvider>(), 
                o.GetService<IOptions<EmailConfirmationTokenProviderOptions>>(), 
                o.GetService<ILogger<DataProtectorTokenProvider<ApplicationUser>>>());

            return service;
        });

        services.AddTransient(o =>
        {
            var service = new CustomPasswordResetTokenProvider<ApplicationUser>(
                o.GetService<IDataProtectionProvider>(),
                o.GetService<IOptions<PasswordResetTokenProviderOptions>>(),
                o.GetService<ILogger<DataProtectorTokenProvider<ApplicationUser>>>());

            return service;
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...