web-dev-qa-db-fra.com

Le fournisseur d'identité ASP.NET SignInManager continue à renvoyer l'échec

J'ai un problème avec le fournisseur d'identité ASP standard pour MVC5. Dès que je me connecte à la méthode:

await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

continue à revenir échec. J'ai donc commencé le débogage, en utilisant:

UserManager.FindByEmail(model.Email);

Cela renvoie un ID utilisateur valide pour que mon utilisateur essaie de se connecter . Ensuite, j'ai utilisé: 

SignInManager.UserManager.CheckPassword(UserIDObtainedFromFind, model.Password);

Et cela retourne true, ce qui signifie que le mot de passe que je fournis est valide ....

Sign In failure

Des idées sur comment je peux tracer, de déboguer la méthode SignInManager.PasswordSignInAsync pour voir où cela échoue?

24
Jacques Bronkhorst

SignInManager.PasswordSignIn fonctionne en dehors du nom d'utilisateur, vous devez vérifier que le nom d'utilisateur est le même que le courrier électronique que vous transmettez.

68
Hao Kung

Si username != email:

ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
23
Владимир Ш.

Pour moi, j'ai trouvé utile d'utiliser SQL Profiler pour voir la requête que PasswordSignInAsync appelait. Dans mon cas, j'ai remarqué qu'il essayait de trouver un utilisateur avec un discriminateur réglé sur "UserContext". Bien entendu, cela ne fonctionnait pas pour moi, car j'ai mis à niveau à partir des services d'adhésion ASP.NET et ce discriminateur a été défini sur Utilisateur. Comme le nouveau code utilise Entity Framework, il apparaît que cette valeur est dérivée de la classe que vous utilisez pour votre utilisateur. Une déclaration de mise à jour rapide a résolu le problème.

UPDATE AspNetUsers SET Discriminator = 'UserContext' WHERE Discriminator = 'User'
2
ProVega

C'est un travail pour moi

ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
1
Z.W.Huang
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, 
model.Password, model.RememberMe, shouldLockout: false);

Cela a fonctionné pour moi parce que mon nom d'utilisateur n'était pas égal à mon email. Votre email et nom d'utilisateur devraient être les mêmes. 

1
joao igor

Si rien de ce qui précède n’est votre cause pour le problème (dans mon cas, le problème était un bug de copier-coller dans ma propre implémentation de IUserStore) et pour répondre à votre question "Toute idée sur la façon dont je peux tracer ou déboguer le SignInManager.PasswordSignInAsync pour voir où elle échoue? ", Une façon de la déboguer serait de copier le contenu de la méthode SignInManager.PasswordSignInAsync dans votre propre classe dérivée (ApplicationSignInManager).

Vous pouvez trouver le code source dans ici ou ici si vous utilisez MVC5 et versions antérieures.

0
Paul

Un peu vieux maintenant, mais voici ma version de cette question.

Je créais des données statiques dans un utilitaire pour vérifier la présence d'éléments standard dans la base de données Identity (rôles et compte administrateur).

Je créais les entités et parlais directement au contexte pour créer les rôles manquants ou cet utilisateur. Le problème que j’avais, c’était que je ne définissais pas les champs NormalizedUserName et NormalizedEmail. Je mettais simplement Email et UserName.

Le code final que j'utilise (avec EF Core 2.x) ressemble à quelque chose comme:

        if (!_context.Users.Any(_ => _.Id.Equals(Users.AdministratorId)))
        {
            var user = new ApplicationUser
            {
                Id = Users.AdministratorId,
                UserName = Users.AdministratorEmail,
                Email = Users.AdministratorEmail,
                EmailConfirmed = true,
                NormalizedEmail = Users.AdministratorEmail.ToUpper(),
                NormalizedUserName = Users.AdministratorEmail.ToUpper(),
                SecurityStamp = Guid.NewGuid().ToString()
            };

            var hasher = new PasswordHasher<ApplicationUser>();
            user.PasswordHash = hasher.HashPassword(user, "our_password");

            _context.Users.Add(user);
        }
0
Adam Houldsworth

Dans votre vérification de démarrage:

options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;

Si elles sont définies sur true, vous devez confirmer l'e-mail ou le numéro de téléphone avant de pouvoir vous connecter.

0