2016-07-11 20 views
0

ich tue benutzerdefinierte Authentifizierung in mvc asp.net identity and owin Framework aber leider nicht vom Benutzer immer mit dem richtigen Anmeldeinformationen mit folgenden Methode:nicht mit richtigen Anmeldeinformationen mit asp.net Identität bekommen Benutzer und owin

var user = UserManager.Find(email, HashedNewPassword); 

Ich habe meine E-Mail gespeichert und Passwort wie unten in meiner Datenbank-Tabelle:

Id  EmailAdress  Password 
1  [email protected] 123456 

Gerade jetzt ich so tue, aber später werde ich dieses Passwort-Hash und speichern sie in der Tabelle. Dies ist nur zum Testen von Microsoft owin Framework.

Aber ich bin nicht mit diesen Anmeldeinformationen erhalte Benutzer:

Emaild Id:[email protected] 
Password:123456. 

Dies ist mein Code:

Controller:

[Authorize] 
     public class AuthenticationController : Controller 
     { 
      public AuthenticationController() 
       : this(new UserManager<UserModel>(new UserStore(new MyEntities()))) 
      { 
      } 

      public AuthenticationController(UserManager<UserModel> userManager) 
      { 
       UserManager = userManager; 
      } 

      public UserManager<UserModel> UserManager { get; private set; } 



      [HttpPost] 
      [AllowAnonymous] 
      [ValidateAntiForgeryToken] 
      public async Task<ActionResult> Login(string email, string password, string returnUrl) 
      { 
       if (ModelState.IsValid) 
       { 
        var user = UserManager.Find(email, password); //getting null here 
       } 
      } 
     } 

UserModel: 

    public class UserModel : IUser 
    { 
     public string Id { get; private set; } 
     public string UserName { get { return Email; } set { Email = value; } } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 


     public UserModel(string email, string firstName, string lastName) 
     { 
      Email = email; 
      FirstName = firstName; 
      LastName = lastName; 
     } 

     public UserModel(Users dbUser) 
     { 
      if (dbUser == null) 
       return; 

      Id = dbUser.Id.ToString(); 
      Email = dbUser.EmailAddress; 

      FirstName = dbUser.FirstName; 
      LastName = dbUser.LastName; 
     } 
    } 





    public class UserStore : IUserStore<UserModel>, IUserPasswordStore<UserModel> 
     { 
      public Task<UserModel> FindByNameAsync(string userName) 
      { 
       return Task.Factory.StartNew(() => 
       { 
        HttpContext.Current = _httpContext ?? HttpContext.Current; 
        var dbUser = GetDbUser(userName); 
        if (dbUser == null) 
         return null; 
        return new UserModel(dbUser); 
       }); 
      } 




      private Users GetDbUser(string userName) 
      { 
       using (var db = new MyEntities()) 
       { 
        return db.Users.FirstOrDefault(u => u.EmailAddress.Equals(userName, StringComparison.OrdinalIgnoreCase)); 
       } 
      } 


      public Task<string> GetPasswordHashAsync(UserModel user) 
      { 
       return Task.Factory.StartNew(() => 
       { 
        HttpContext.Current = _httpContext ?? HttpContext.Current; 
        var userObj = GetDbUser(user); 

        int len = userObj.Password.Length % 4; 
        //solved this error with below code :Invalid length for a Base-64 char array 
        if (len > 0) userObj.Password = userObj.Password.PadRight(userObj.Password.Length + (4 - len), '='); 
        return userObj.Password; //sometimes progam gets stuck here on debugging 
       }); 
      } 


      private Users GetDbUser(UserModel user) 
      { 
       if (user.Id == null) 
        return null; 
       return GetDbUser(Convert.ToInt32(user.Id)); 
      } 

      private Users GetDbUser(int userId) 
      { 
       using (var db = new MyEntities()) 
       { 
        return db.Users.FirstOrDefault(u => u.Id == userId); 
       } 
      } 
     } 

Was ist das Problem?

Antwort

1

Wenn ich Sie richtig verstanden habe, speichern Sie das Passwort als Klartext in der Datenbank? Wenn das der Fall ist, dann ist das dein Problem. Sie können es nicht einfach später auswählen. Die Identität muss hashed sein, um das Passwort zu finden. Dies ist, wie die Authentifizierung funktioniert:

  1. Benutzer sendet Benutzername und Passwort
  2. Identität Hashes abgegeben Passwort
  3. Identität der Benutzer sieht auf den vorgelegten Benutzernamen passende und vergleicht das Passwort auf diesem Datensatz mit dem Passwort Hash vorgelegt. Wenn es übereinstimmt, wird der Benutzer angemeldet.

Also, wenn Identität der Hash-Version von 123456 zum Klartext 123456 vergleicht, wird es nie entsprechen. Damit es übereinstimmt, muss das in der DB gespeicherte Passwort ebenfalls gehashed werden.

+0

Aber im Grunde wir gewohnt Ab sofort geben wir jede Art von Registrierung an. Wir werden Benutzer direkt aus der Datenbank erstellen, damit nur einige Benutzer sich schnell bei System anmelden können. Also, wie mache ich das? –

+1

Auch wenn Sie Benutzern nicht erlauben, sich direkt zu registrieren, sollten Sie immer noch eine Art Administrator zur Verfügung stellen, von wo aus Sie neue Benutzer erstellen können, in denen Sie dann das festgelegte Passwort hashen können. Da Identity ziemlich genau die Verantwortung für das Hashing übernehmen muss, damit es später bei der Anmeldung des Benutzers zutrifft, müssen Sie es über die API Identity bereitstellen, anstatt nur Datensätze manuell zur Datenbank hinzuzufügen. –

+0

Aber wenn Sie diese Methode betrachten GetDbUser (Benutzer) dieses GetPasswordHashAsync ich bekomme Benutzer aber wenn ich debuggen und Kontrolle kommt in dieser Zeile zurück BenutzerObj.Password; dann Programm stecken bleiben.Warum passiert das ?? –

0
var user = UserManager.Find(email, password); //getting null here 

Ich hatte ein ähnliches Problem. Ihre Funktion gibt null zurück, da diese Funktion mit UserName funktionieren muss.

1.

var user = UserManager.Find(UserName, password); 

, die Sie eingeben ist: Anmeldung: mylogin

Passwort: 123123

E-Mail: mylogin @ email.com

und diese Funktion Arbeit mit Login (Username fiel auf den Tisch AspNetUserLogins)

Sie wollen

var user = UserManager.Find([email protected], password);

übertragen, aber tatsächlich ist es var user = UserManager.Find(MyLogin, password);

Attenction übertragen! Das sind zwei verschiedene Zellen in der Tabelle

  1. Erstellen Sie einfach Ihre Benutzer diese und Ihre Standard-Funktionen der Arbeit sein:

ApplicationUser user = new ApplicationUser { UserName = model.Email, Email = model.Email, Year = model.Year };