2014-10-17 2 views
17

MVC5 용 표준 ASP ID 공급자에 문제가 있습니다. 최대한 빨리 로그인하십시오 :ASP.NET Identity Provider SignInManager가 반환 실패를 계속합니다.

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

오류가 계속 반환됩니다. 그런 다음

UserManager.FindByEmail(model.Email); 

이가 로그인을 시도 내 사용자에 대한 유효한 사용자 ID를 반환 을 내가 사용 :. 그래서 사용하여 디버깅을 시작

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

을 그리고 이것은 암호 즉, true를 돌려줍니다 나는 .... 유효 제공 나가의 SignInM를 디버깅의 추적 할 수있는 방법에

Sign In failure

어떤 아이디어 anager.PasswordSignInAsync 어디에서 실패하는지 확인하는 방법은 무엇입니까?

답변

57

SignInManager.PasswordSignIn 사용자 이름 오프 작동, 당신은 사용자 이름이 당신이 전달하는 이메일과 동일 함을 다시 한 번 확인해야

+0

어디 올바른지. 사용자 이름 필드를 사용하여 사용자의 화면 이름을 저장했습니다. 다시 되돌리고 화면 이름 필드를 추가하면 내 문제가 해결되었습니다. 감사! –

+0

수동으로 작업하는 경우 NormalizedUserName도 되돌려 야합니다. –

16

username != email 경우 :. 나, 내가 들어

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

코드를 게시 할 때 올바른 형식을 사용하십시오. 입력 필드 바로 위에있는 {} 버튼을 사용할 수 있습니다. 더 나은 가독성을 제공합니다. – SubliemeSiem

1

PasswordSignInAsync가 호출 한 쿼리를보기 위해 SQL 프로파일 러를 사용하는 것이 도움이된다는 것을 발견했습니다. 제 경우에는 - Discriminator가 "UserContext"로 설정된 사용자를 찾으려고한다는 것을 알았습니다. ASP.NET 멤버십 서비스에서 업그레이드하여이 Discriminator가 User로 설정 되었기 때문에 이것은 물론 저에게는 효과가 없었습니다. 새 코드는 Entity Framework를 사용하므로이 값은 사용자에게 사용하는 클래스에서 파생 된 것 같습니다. 빠른 업데이트 성명서로 문제가 해결되었습니다.

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

+1 Profiler에 대한 언급은 수년간 그것을 사용하지 않았지만 잊어 버렸습니다.하지만 필자가 필요로하는 것이 었습니다. 감사! – Resource

0

그것은 내 이름이 내 이메일을 동일하지 않은 렸기 때문에 이것은 나를 위해 일한 나를

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

에 대한 작업입니다. 이메일과 사용자 이름이 동일해야합니다.

0

조금 오래되었지만 여기에이 문제에 대한 제 제안이 있습니다.

유틸리티에서 일부 정적 데이터 작성을 수행하여 Identity 데이터베이스 (역할 및 관리자 계정)에 몇 가지 표준 사항이 있는지 확인했습니다.

실종 된 역할이나 사용자를 만들기 위해 엔티티를 만들고 컨텍스트에 직접 이야기하고있었습니다. 문제는 내가 NormalizedUserNameNormalizedEmail 필드를 설정하지 않았다는 것입니다. 나는 단순히 EmailUserName으로 설정했다.

내가 (EF 코어 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); 
     } 
0

:이 true로 설정되어있는 경우

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

을 수행해야 로그인하기 전에 이메일 또는 전화 번호를 확인하십시오.