web-dev-qa-db-fra.com

Comment créer ApplicationUser par UserManager dans Seed méthode de ASP .NET MVC 5 Web application

Je peux créer des utilisateurs à l'ancienne:

 var users = new List<ApplicationUser> { 
                        new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "[email protected]", UserName = "[email protected]",  SecurityStamp = Guid.NewGuid().ToString()},
                        new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "[email protected]", UserName = "[email protected]",  SecurityStamp = Guid.NewGuid().ToString()}
                        };

users.ForEach(user => context.Users.AddOrUpdate(user));

context.SaveChanges();

mais je veux le faire de la manière ASP.NET MVC 5.1 en utilisant UserManager. J'ai regardé à quoi ressemble la méthode Register POST dans AccountController:

 public async Task<ActionResult> Register(RegisterViewModel model) {
            if (ModelState.IsValid) {
                var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
                IdentityResult result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded) { [...]

alors j'ai essayé de faire de même:

var user =  new ApplicationUser() { Email = "[email protected]", 
                                    UserName = "[email protected]"};
IdentityResult result =  UserManager.CreateAsync(user, "abcwq12312!P");

mais je reçois ceci:

enter image description here

aussi si je tape simplement UserManager. VS2013 n'affiche aucune méthode dans la liste.

Alors, comment ajouter un utilisateur de cette manière?

EDIT1:

enter image description here

13
Yoda

Ok donc pour créer l'utilisateur CreateAsync n'est pas nécessaire le problème était ailleurs. Il faut utiliser ApplicationUserManager pas UserManager (celui-ci n'a rien ajouté à la base de données).

 var store = new UserStore<ApplicationUser>(context);
 var manager =  new ApplicationUserManager(store);
 var user = new ApplicationUser() { Email = "[email protected]", UserName = "[email protected]" };
 manager.Create(user, "TestPass44!");
14
Yoda

Je ne comprends pas l'erreur que vous montrez, sauf si vous fournissez un TUser ou TKey personnalisé, auquel cas ce serait:

IdentityResult user = await UserManager.CreateAsync<CustomUser, CustomKey>(user, "abcwq12312!P");

et en passant l'utilisateur comme votre CustomUser au lieu de ApplicationUser et peut-être int si votre CustomKey est un int au lieu d'une chaîne. (CreateAsync peut inférer des types, je l'ai posté pour les montrer explicitement)

L'autre problème que je vois est que vous n'attendez pas la tâche, vous devez également ajouter attendre comme:

IdentityResult user = await UserManager.CreateAsync(user, "abcwq12312!P");

J'espère que cela t'aides.


MODIFIER:

Pour être complet, je posterai la réponse complète de cette question mais il y a votre réponse. : Impossible d'accéder à CreateAsync dans le Gestionnaire des utilisateurs

var result = await UserManager.CreateAsync(user, register.Password);

Le UserManager dans l'instruction ci-dessus n'est pas un Class comme je m'y attendais. C'est une propriété de type UserManager<ApplicationUser>.

Donc, au début, je viens de déclarer une propriété comme

public UserManager<ApplicationUser> UserManager { get; private set; }

Et maintenant, je peux utiliser la version Async pour créer des utilisateurs. La déclaration suivante fonctionne.

var result = await UserManager.CreateAsync(user, register.Password);

Je signalerai également d'éventuels doublons.

1
Bart Calixto