2014-06-13 8 views
6

Ich habe einen neue MVC 5 Rasierer, EF 6 Web-Anwendung mit ASP.NET Identität 2 für das Mitgliedschaft System. Wenn ich die Benutzer manuell über den Link Registrieren auf der Webseite erstelle, ist alles in Ordnung. Ich kann den Benutzer erstellen, ich kann mich dann mit dem angegebenen Passwort anmelden und mich dann abmelden.kann nicht auf ASP.NET Identität anmelden 2-Website nach programmatischer Benutzererstellung

Ich weiß nicht, wie man den Datenbankinitialisierer mit Migration für Identity 2 benutzt, es gibt unzählige Beispiele mit Identity 1 und anderen Alpha- und Betaversionen, die nur dazu dienen, Leute zu verwirren. Da ich das noch nicht weiß, verwende ich eine temporäre MVC-Ansicht, um die Mitgliedschaft zu installieren.

Ich sehe, dass die Ansicht ordnungsgemäß ausgeführt wird, ich sehe die Benutzer und Rollen sowie die Zuordnungen von Benutzern mit Rollen in der Datenbank. Ich sehe auch, dass die Benutzer ein Hash-Passwort im Datensatz haben.

Allerdings, nachdem ich das getan kann ich nicht in das Identitätssystem (lokal) mit den Klartext Passwörter Ich verwendete in der Create-Methode, warum? Übrigens habe ich das try/catch weggelassen und nach Benutzer- und Rollenerstellungen gesucht (sie werden ohne Fehler ausgeführt).

DbContext ctx = ApplicationDbContext.Create(); 
transaction = ctx.Database.BeginTransaction(); 
RoleManager<IdentityRole> roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(ctx)); 
var roleAdmin = roleManager.Create(new IdentityRole("Admin")); 

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ctx)); 
ApplicationUser userAdmin = new ApplicationUser { Id = "admin", Email = "[email protected]", UserName = "admin" }; 
      userManager.Create(userAdmin, "Test_2013"); 
userManager.AddToRole(userAdmin.Id, "Admin"); 
userManager.Update(userAdmin); 

transaction.Commit(); 

danach Also, wenn ich auf das Konto mit der E-Mail-Adresse und dem Test_2013 Passwort einzuloggen versuchen, erhalte ich einen Fehler anzeigt, den Benutzername/Passwort falsch ist.

Antwort

20

Nach vielen Untersuchungen über die eigentliche Datenbank (Identity 2) und das Internet kam ich zu dem Schluss niemand wusste :) In der Tat von den Millionen von Websites, die Informationen über Identität veraltet und sogar Identität 2.0 Code, der bereits veraltet ist Ich musste mich weiter mit dem SQL Profiler und dem SQL Management Studio beschäftigen.

In Identity 2.0 gibt es eine Id-Eigenschaft, die ein nvarchar() ist, aber tatsächlich eine Guid enthält. Ich frage mich, warum Microsoft es nicht einfach zu einem Unique Identifier Typ gemacht hat ?! Ich habe diese Eigenschaft festgelegt, wenn ich es in Ruhe gelassen hätte (lassen Sie es automatisch generieren).

In Identity 2.0 gibt es auch ein UserName Feld, das ich mit dem Benutzernamen ausgefüllt habe. Es scheint, dass UserName der gleiche wie Email sein sollte, sonst versagt der Anmeldeversuch einfach.

+4

Vielen Dank für das Hinzufügen des letzten Teils über den Benutzernamen, der der E-Mail entsprechen muss. Du hast mein Problem gelöst! – ChemProfMatt

+1

Danke Ich war verblüfft, bis Sie auf dieses ansonsten unmerkliche Problem hingewiesen haben. – Sagi

+0

DIESES !!! Ich hasse Microsoft und alle, die denken, dass Microsoft brauchbare Dokumentation oder APIs produziert ... USERNAME MUSS EMAIL für Götterwillen Match, die Idee ist, war diese BS ??? – Pali

6

Im LoginViewModel ist ein Fehler aufgetreten. Wenn Sie sich die Login-Methode (Post-Version) ansehen, sollte der erste Parameter der PasswordSignInAsync-Methode der Benutzername sein, aber im loginViewModel haben wir stattdessen die E-Mail.

Offensichtlich können Sie es nicht richtig funktionieren lassen, da PasswordSignInAsync tatsächlich den ersten Parameter als Benutzernamen und nicht die E-Mail-Adresse betrachtet, und es gibt einen E-Mail-Validator für die Email-Eigenschaft im LoginViewModel.

Sie müssen die Email-Eigenschaft des LoginViewModel beispielsweise in UserName umbenennen und die EmailAddress-Annotation entfernen.

Dann müssen Sie in der entsprechenden Login-Ansicht das E-Mail-Eingabefeld ersetzen und stattdessen den Benutzernamen verwenden.

Dann in der Login-Methode in der AccountController, verwenden Sie den Model.UserName als ersten Parameter, und es sollte jetzt korrekt funktionieren.

5

Ich war auch mit diesem stressigen Thema konfrontiert.Es hat mit der Standard-Login-Methode in dem AccountsController erstellt werden:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     // This doesn't count login failures towards account lockout 
     // To enable password failures to trigger account lockout, change to shouldLockout: true 
     var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
    } 

können Sie sehen, dass

„erwarten SignInManager.PasswordSignInAsync (model.Email, model.Password, model.RememberMe, shouldLockout : falsch); "

wird, einschließlich der E-Mail als ersten Parameter, aber wenn man die Definition für PasswordSignInAsync überprüfen Sie werden sehen, dass es MUST den Benutzernamen als ersten Parameter und nicht die E-Mail erhalten.

Es funktioniert standardmäßig, da die Methode zum Registrieren eines neuen Benutzers beide Eigenschaften (Benutzername und E-Mail) auf den vom Benutzer angegebenen E-Mail-Wert einstellt. Wenn Sie jedoch einen neuen Benutzer programmatisch gespeichert und den Benutzernamen und die E-Mail-Adresse auf andere Werte gesetzt haben, schlägt die Anmeldung fehl.

Das von allen ist, bedeutet einen Fehler von -> MS < - „ich die Jungs vertraut und damit verbracht, mehrere Stunden, damit es funktioniert, bis ich über sie zu bezweifeln“

So wissen Sie jetzt, was zu do: 1) Ändern Sie Ihre Login-Methode, um den Benutzernamen als erstes Argument zu übergeben. Ändern Sie die Methode zum Speichern von Benutzernamen und E-Mail mit unterschiedlichen Werten. Ich hoffe, es hilft jemand anderem.

+0

Sie sind ein Genie, nur haben Sie richtige Antwort, ich suchte überall, danke mein Freund :) Ich überprüfe sowohl Benutzername und E-Mail für Login, um zu sehen, ob entweder funktioniert – transformer

+0

Ich befüllte meine Datenbank mit gefälschten Daten, aber ich Ich kann mich nicht mit diesen Benutzern einloggen, auch nachdem ich den Benutzernamen und die E-Mail als gleich eingestellt habe, irgendwelche Ideen, warum ich mich nicht anmelden kann, seine Identity 2.2 ASP MVC 5 – transformer

Verwandte Themen