2017-09-11 3 views
0

J'ai une application Web utilisant asp.net core 2.0 avec un noyau d'infrastructure et d'identité. J'essaie de créer quelques utilisateurs après la création de DB. J'ai créé la classe DbInitializer qui est appelé à partir Program.Main()Accéder à UserManager avec PasswordHasher en dehors du contrôleur

public static void Main(string[] args) 
    { 
     var host = BuildWebHost(args); 

     using (var scope = host.Services.CreateScope()) 
     { 
      var services = scope.ServiceProvider; 
      try 
      { 
       var context = services.GetRequiredService<ApplicationDbContext>(); 
       DbInitializer.Initialize(context); 
      } 
      catch (Exception ex) 
      { 
       var logger = services.GetRequiredService<ILogger<Program>>(); 
       logger.LogError(ex, "An error occurred while seeding the database."); 
      } 
     } 

     host.Run(); 
    } 

Le problème est que je ne peux pas accéder à UserManager petit morceau droit PasswordHasher dans ma classe. J'essaie cette answer, et je créé de nouvelles UserManager comme celui-ci

var store = new UserStore<ApplicationUser>(context); 
var hasher = new PasswordHasher<ApplicationUser>(); 
var manager = new UserManager<ApplicationUser>(store, null, hasher, null, null, null, null, null, null); 
await manager.CreateAsync(user, "password"); 

Et puis je crée l'utilisateur. L'utilisateur est créé et je peux le voir dans la base de données, le problème est que je ne peux pas me connecter avec un mot de passe donné. Je pense que le problème est que j'ai créé un nouveau PasswordHasher. Comment puis-je accéder à UserManager qui est utilisé dans l'application? ..

Répondre

0

J'ai rencontré un problème similaire en essayant de lancer des utilisateurs dans ma base de données, voici comment je l'ai résolu.

Essayez de passer des services à la place de contexte à votre méthode Initialize:

DbInitializer.Initialize(services); 

mettre à jour votre méthode Initialize Puis:

public static void Initialize(IServiceProvider services) { 

    var context = services.GetRequiredService<ApplicationDbContext>(); 
    //Do stuff with context   

    //Obtain reference to UserManager 
    var userManager = services.GetRequiredService<UserManager<ApplicationUser>>(); 

    // Set properties for new User 
    ApplicationUser user = new ApplicationUser 
    { 
     UserName = "[email protected]", 
     Email = "[email protected]" 
    }; 

    //Set password 
    string password = "Change.Me99"; 

    //Create new user 
    var result = userManager.CreateAsync(user, password); 

    //Check the result 
}