Подтвердить что ты не робот

Поставщик удостоверений ASP.NET SignInManager сохраняет возвращающийся сбой

У меня проблема со стандартным провайдером ASP Identity для MVC5. Как только я зарегистрирую метод:

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

сохраняет Failure. Поэтому я начал отладку, используя:

UserManager.FindByEmail(model.Email);

Это возвращает действительный UserID для моего пользователя, пытающегося войти в систему. Затем я использовал:

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

И это возвращает true, что означает, что пароль, который я предоставляю, действителен....

Sign In failure

Любые идеи о том, как я могу отслеживать, отладить метод SignInManager.PasswordSignInAsync, чтобы увидеть, где он не работает?

4b9b3361

Ответ 1

SignInManager.PasswordSignIn работает с именем пользователя, вы должны дважды проверить, что имя пользователя совпадает с именем, которое вы передаете.

Ответ 2

Если username != email:

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

Ответ 3

Для меня я нашел полезным использовать SQL Profiler для просмотра запроса, который вызывал PasswordSignInAsync. В моем случае - я заметил, что он пытался найти пользователя с дискриминатором, установленным на "UserContext". Это, конечно, не работало для меня, потому что я обновился из ASP.NET Membership Services, и этот Дискриминатор был настроен на пользователя. Поскольку новый код использует Entity Framework, это значение выводится из класса, который вы используете для своего пользователя. Операция быстрого обновления исправила проблему.

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

Ответ 4

Это работает для меня

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

Это сработало для меня, потому что мое имя пользователя не было равно моей электронной почте. Ваш адрес электронной почты и имя пользователя должны совпадать.

Ответ 6

Теперь бит старый, но здесь моя таппенс по этой проблеме.

Я делал некоторое статическое создание данных в утилите, чтобы гарантировать, что в базе данных Identity присутствуют некоторые стандартные вещи (роли и учетная запись администратора).

Я создавал сущности и напрямую разговаривал с контекстом для создания любых отсутствующих ролей или этого пользователя. Проблема была в том, что я не устанавливал поля NormalizedUserName и NormalizedEmail. Я просто установил Email и UserName.

Последний код, который я использую (с EF Core 2.x), выглядит примерно так:

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