ASP.NET le fournisseur D'identité SignInManager continue de retourner L'échec

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

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

continue de retourner L'échec. J'ai donc commencé à déboguer, en utilisant:

UserManager.FindByEmail(model.Email);

ceci renvoie un identifiant D'utilisateur valide pour mon utilisateur qui essaie de se connecter. Ensuite, j'ai utilisé:

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

Et renvoie true, ce qui signifie que le mot de passe que j'offre est valide....

Sign In failure

toutes les idées sur la façon dont je peux tracer, de déboguer le SignInManager.PasswordSignInAsync méthode pour voir où il échoue?

21
demandé sur Jacques Bronkhorst 2014-10-17 21:11:39

8 réponses

SignInManager.PasswordSignIn fonctionne à partir d'un nom d'utilisateur, vous devriez vérifier que le nom d'utilisateur est le même que l'e-mail que vous transmettez.

66
répondu Hao Kung 2014-10-17 19:44:17

Si username != email:

ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
22
répondu Владимир Ш. 2016-02-26 15:52:52

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 sûr, ça ne marchait pas pour moi parce que je suis passé de ASP.NET services D'adhésion et ce discriminateur a été mis à L'utilisateur. Puisque le nouveau code utilise Entity Framework, il semble que cette valeur soit dérivée de la classe que vous utilisez pour votre utilisateur. Une mise à jour rapide instruction fixe le question.

UPDATE AspNetUsers SET Discriminator = 'UserContext' WHERE Discriminator = 'User'
2
répondu ProVega 2016-10-29 23:11:36
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 votre nom d'utilisateur doit être le même.

1
répondu joao igor 2017-04-23 01:34:12

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);
0
répondu Z.W.Huang 2017-03-16 03:24:17

Peu vieux maintenant, mais voici mon tuppence sur cette question.

j'étais en train de créer des données statiques dans un utilitaire pour m'assurer que certaines choses standard étaient présentes dans la base de données D'identité (rôles et compte administrateur).

je créais les entités et je parlais directement au contexte pour créer les rôles manquants ou cet utilisateur. Le problème que j'avais était que je ne mettais pas le NormalizedUserName et NormalizedEmail champs. J'étais tout simplement de la configuration de Email et UserName.

le code final que j'utilise (avec EF Core 2.x) est 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
répondu Adam Houldsworth 2018-01-18 16:40:55

dans votre vérification de démarrage:

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

si ceux-ci sont définis à true, vous devez confirmer le courriel ou le numéro de téléphone avant de pouvoir vous connecter.

0
répondu Fernando Feliciano Jr. 2018-02-13 03:22:04

dans le cas où aucun de ce qui précède n'est votre cause pour le problème (dans mon cas, le problème était un bogue copier-coller dans ma propre implémentation D'IUserStore) et pour répondre à votre question"N'importe quelles idées sur comment je peux tracer, ou déboguer le SignInManager.Méthode PasswordSignInAsync pour voir où elle échoue?", une façon de déboguer serait de copier le contenu de la méthode SignInManager.Passerwordsigninasync dans votre propre classe dérivée (ApplicationSignInManager).

Vous pouvez trouver la source code dans ici ou ici si vous utilisez MVC5 et inférieur.

0
répondu Paul 2018-08-22 09:55:04