Jacques Bronkhorst
Jacques Bronkhorst

Reputation: 1695

ASP.NET Identity Provider SignInManager Keeps Returning Failure

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....

Sign In failure

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

Upvotes: 46

Views: 39776

Answers (11)

Zsolt
Zsolt

Reputation: 11

My problem was that the website could not connect to the database over mobile net, when I used the stardard wifi it worked...

Upvotes: 0

Pablo Silva
Pablo Silva

Reputation: 111

In my case the same probe validating the email and password, the email is the same as my user.

    var userDO = _userManager.FindByEmailAsync(Input.Email).Result;
    var validatr = _userManager.CheckPasswordAsync(userDO, Input.Password);

email = userName

true result

Then I checked the database and found that the verification field of the user that did not work is false

enter image description here

Then the verification parameter must be validated in the startup. that is inside the Startup.cs

public void ConfigureServices(ServiceCollection services)
{
//......
            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddRoles<IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>();
//......
}

enter image description here

The above property setting Gets or sets a flag indicating whether a confirmed IUserConfirmation account is required to sign in

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

Bye!

Upvotes: 11

Pablo Chvx
Pablo Chvx

Reputation: 1931

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.

enter image description here

Upvotes: 0

Paul
Paul

Reputation: 1264

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.

Upvotes: 0

Fernando Feliciano Jr.
Fernando Feliciano Jr.

Reputation: 199

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.

Upvotes: 4

Adam Houldsworth
Adam Houldsworth

Reputation: 64517

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

Upvotes: 0

joao igor
joao igor

Reputation: 11

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.

Upvotes: 1

Z.W.Huang
Z.W.Huang

Reputation: 334

It's Work for me

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

Upvotes: 0

ProVega
ProVega

Reputation: 5914

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'

Upvotes: 2

Владимир Ш.
Владимир Ш.

Reputation: 439

If username != email:

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

Upvotes: 33

Hao Kung
Hao Kung

Reputation: 28200

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.

Upvotes: 97

Related Questions