2014-10-01 4 views
1

다음 Login 작업이 있고 UserManager.FindAsync는 항상 null을 반환합니다. 맨 아래에 표시된 코드로 사용자를 시드하려고합니다.UserManager.FindAsync는 항상 null을 반환합니다.

아무도 도와 줄 수 있습니까?

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindAsync(model.Email, model.Password); 
      if (user != null) 
      { 
       await SignInAsync(user, model.RememberMe); 
       return RedirectToLocal(returnUrl); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalid username or password."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

마이그레이션에 대한 Configuration.cs에는 다음과 같은 코드 비트가 있습니다. 그것은 내가 위의 코드로 로그인하려고 시도하는 사용자를 시드하는 것입니다.

protected override void Seed(Temps.Models.ApplicationDbContext context) 
    { 
     if (!context.Roles.Any(r => r.Name == "Consultant")) 
     { 
      var store = new RoleStore<IdentityRole>(context); 
      var manager = new RoleManager<IdentityRole>(store); 
      var role = new IdentityRole { Name = "Consultant" }; 

      manager.Create(role); 
     } 

     if (!context.Users.Any(u => u.UserName == "Consultant")) 
     { 
      var store = new UserStore<ApplicationUser>(context); 
      var manager = new UserManager<ApplicationUser>(store); 
      var user = new ApplicationUser 
      { 
       UserName = "Consultant", 
       Email = "[email protected]" 
      }; 

      manager.Create(user, "password"); 
      manager.AddToRole(user.Id, "Consultant"); 
     } 

UPDATE 나는 아래의 씨앗 코드에 대해 다음과 같은 오류가 안토니의 변화, 어떤 아이디어를 구현 한 후

?

PM> Update-Database 대상 데이터베이스에 적용되는 SQL 문을 보려면 '-Verbose'플래그를 지정하십시오. 명시 적 마이그레이션이 보류 중입니다. 시드 실행 방법. System.InvalidOperationException : UserId를 찾을 수 없습니다. System.Data.Entity.Migrations.DbMigrator에서 Microsoft.AspNet.Identity.UserManagerExtensions.AddToRole에서 Microsoft.AspNet.Identity.UserManager 2.<AddToRoleAsync>d__83.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.AsyncHelper.RunSync[TResult](Func FUNC 1)에서 [TUser, TKEY (UserManager 2 manager, TKey userId, String role) at Temps.Migrations.Configuration.Seed(ApplicationDbContext context) in c:\Work\@wandc\Temps\trunk\src\Temps\Migrations\Configuration.cs:line 67 at System.Data.Entity.Migrations.DbMigrationsConfiguration 1.OnSeed (DbContext 컨텍스트) .SeedDatabase() System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase (에서 ) System.Data.Entity.Migrations.DbMigrator.Upgrade (IEnumerable을 1 pendingMigrations, String targetMigrationId, String lastMigrationId) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable 1 pendingMigrations, 문자열 targetMigrationId, 문자열 lastMigrationId) 시스템에서 에서 . Data.Entity.Migrations.DbMigrator.UpdateInternal (String targetMigration) at System.Data.Entity.Migrations.DbMigrator. <> c__DisplayClassc.b__b() at System.Data.Entity.Mi grations.DbMigrator.EnsureDatabaseExists (액션 mustSucceedToKeepDatabase) System.Data에서 System.Data.Entity.Migrations.DbMigrator.Update (문자열 targetMigration) 에서 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists (액션 mustSucceedToKeepDatabase) 에서 .Entity.Migrations.Infrastructure.MigratorBase.Update (문자열 targetMigration) System.AppDomain에서 System.AppDomain.DoCallBack에서 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() (CrossAppDomainDelegate callBackDelegate) 에서 . DoCallBack (CrossAppDomainDelegate callBackDelegate) at System.Data.Entity.Migrations.Design.ToolingFacade.Run (BaseRunner runner) at System.Data.Entity.Migrations.Design.ToolingFacade.Update (String targetMigration, Boolean force) at System.Data.Entity.Migrations.UpdateDatabaseCommand. <> c__DisplayClass2 < .ctor> b__0() at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute (작업 명령) UserId를 찾을 수 없습니다.

코드 :

 if (!context.Users.Any(u => u.UserName == "[email protected]")) 
     { 
      string emailAddress = "[email protected]"; 

      var store = new UserStore<ApplicationUser>(context); 
      var manager = new UserManager<ApplicationUser>(store); 
      var user = new ApplicationUser() 
      { 
       UserName = emailAddress, 
       Email = emailAddress, 
       FirstName = "Admin", 
       LastName = "Admin", 
       PasswordHint = password 
      }; 

      manager.Create(user, password);     
      manager.AddToRole(user.Id, "Admin"); 
     } 

답변

4

FindAsync()는 첫 번째 매개 변수로 사용자 이름을합니다. 따라서 실제로는 이메일 대신 사용자 이름을 사용하기 위해 로그인 양식/viewmodel을 변경해야합니다.

표준 ASP.NET 템플릿을 사용하면 사용자 이름이 이메일로 설정되므로 FindAsync()이 바로 이메일 주소와 함께 작동합니다. 따라서 다른 옵션은 동일한 작업을 수행하고 데이터베이스 시드시 사용자 이름으로 전자 메일을 사용하는 것입니다.

+0

감사 안토니로 로그인 할 수 있고 지금은 위의 오류가? – Burt

+0

역할에 추가하기 전에 성공을 위해'manager.Create (user, password)'의 반환 값을 확인하십시오. 내 생각 엔 사용자 생성에 문제가있어 아마도 암호가 충분하지 않을 수도 있습니다. (또한 좋은 암호 힌트 :). –

+0

:) 테스트 용으로 만 사용하면 처음에는 모든 것이 삭제되고 실제 환경에서 다시로드됩니다 (희망 사항) – Burt

4

위의 대답은 제가이 하나를 만드는 데 도움이되었습니다. 이제

 if (ModelState.IsValid) 
     { 
      IOwinContext context = Request.GetOwinContext(); 



      var user = await UserManager.FindAsync(model.Email, model.Password); 
      var u = await UserManager.FindByEmailAsync(model.Email); 
      bool passhash = false; 
      if (u != null) 
      { 
       passhash = await UserManager.CheckPasswordAsync(u, model.Password); 
      } 
      //ApplicationUser user = await repo.FindUser(model.Email, model.Password); 
      if (user != null) 
      { 
       await SignInAsync(user, model.RememberMe); 
       return RedirectToLocal(returnUrl); 
      } 
      else if (u != null && passhash) 
      { 
       await SignInAsync(u, model.RememberMe); 
       return RedirectToLocal(returnUrl); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalid username or password."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 

당신이 변화를 구현하는 사용자 이름이나 암호

관련 문제