ASP.NET Identity Provider SignInManager Keeps Retu

2019-03-11 23:40发布

问题:

I have an issue with the standard ASP Identity provider for MVC5. As soon as I log in the method:

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

keeps returning Failure. So I started debugging, By using:

UserManager.FindByEmail(model.Email);

This returns a valid UserID for my user trying to log in. Then I used:

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

And this returns true, which means that the password I provide is valid....

Any ideas on how I can trace, of debug the SignInManager.PasswordSignInAsync method to see where it fails?

回答1:

SignInManager.PasswordSignIn works off of user name, you should double check that the user name is the same as the email you are passing in.



回答2:

If username != email:

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


回答3:

For me, I found it helpful to use SQL Profiler to see the query that PasswordSignInAsync was calling. In my case - I noticed it was trying to find a user with a Discriminator set to "UserContext". This of course wasn't working for me because I upgraded from ASP.NET Membership Services and this Discriminator was set to User. Since the new code uses Entity Framework, it appears this value is derived from the class you use for your user. A quick update statement fixed the issue.

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


回答4:

It's Work for me

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


回答5:

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

This worked for me becouse my username was not equal my email. Your email and username should be the same.



回答6:

Bit old now, but here's my tuppence on this issue.

I was doing some static data creation in a utility to ensure some standard things were present in the Identity database (roles and an administrator account).

I was creating the entities and talking directly to the context to create any missing roles or that user. The issue I had was that I wasn't setting the NormalizedUserName and NormalizedEmail fields. I was simply setting Email and UserName.

The final code I use (with EF Core 2.x) is something like:

        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);
        }


回答7:

In your startup check:

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

If these are set to true, you need to confirm the email or phone number before you can login.



回答8:

In case none of the above is your cause for the problem (in my case the problem was a copy-paste bug in my own implementation of IUserStore) and to answer your question "Any ideas on how I can trace, or debug the SignInManager.PasswordSignInAsync method to see where it fails?", one way to debug it would be to copy the contents of the method SignInManager.PasswordSignInAsync into your own derived class (ApplicationSignInManager).

You may find the source code in here or here if you're using MVC5 and lower.



回答9:

Maybe my experience can help somebody. In my case, the problem was that I changed my computer, and in my new Windows 10, IIS feature was installed but not ASP.NET feature.