2017-03-27 4 views
0

Ich implementiere eine Richtlinie, wo Passwörter nicht wiederverwendet werden können und die Struktur an Ort und Stelle haben, aber ich versuche herauszufinden, wie man dies mit dem PasswordHasher überprüfen kann, bekomme ich immer eine fehlgeschlagene Übereinstimmung. Bitte helfen Sie diese auf ..PasswordHasher schlägt immer fehl Validation

 try 
     { 
      UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(context); 
      UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(store); 
      ApplicationUser cUser = await store.FindByNameAsync(model.UserName); 
      if (cUser == null) 
      { 
       ModelState.AddModelError("", "User ID is not correct, please check and try again."); 
       return BadRequest(ModelState); 
      } 
      else 
      { 
       /// Need to check the new password is already entered recently 
       DataController dataController = new DataController(); 

       string[] pwds = dataController.CheckIfNewPasswordSameAsLastFivePassword(model.UserName); 

       if (pwds != null) 
       { 
        foreach (string pwd in pwds) 
        { 
         PasswordVerificationResult result1 = UserManager.PasswordHasher.VerifyHashedPassword(pwd, model.UserIdentifier); 

         if (result1 == PasswordVerificationResult.Success) 
         { 
          ModelState.AddModelError("", "Please choose a password that you have not used before"); 
          return BadRequest(ModelState); 
         } 
        } 

       } 
       //Send new password in model.UserIdentifier 
       await store.SetPasswordHashAsync(cUser, UserManager.PasswordHasher.HashPassword(model.UserIdentifier)); 
       await store.UpdateAsync(cUser); 
       ApplicationUser userdetails = new ApplicationUser(); 

       userdetails = dataController.GetUsersDetails(model.UserName); 
       if (userdetails.Email != null) 
       { 
        await ResetORForgotPasswordSendEmail(userdetails.FirstName, userdetails.UserName, userdetails.Email); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.Error(ex.Message, ex); 
     } 

     return Ok(); 
    } 

Antwort

1

VerifyHashedPassword wird das Passwort mit dem aktuellen Kennwort des Benutzers zu vergleichen. Was Sie stattdessen tun sollten, ist einfach Hash-das neue Passwort und eine einfache Zeichenfolge im Vergleich zu Ihrer Liste der alten Passwort Hashes:

+1

Ich verstehe nicht, wie das funktionieren kann. Für das korrekte Kennwort-Hashing muss ein Salz verwendet werden. Die einzige Möglichkeit, um zu überprüfen, ob ein Passwort zuvor verwendet wurde, besteht darin, das aktuelle Passwort in Kombination mit den vorherigen Salden zu hashen. Ich kann nicht sehen, dass das hier passiert, aber ich habe keine Ahnung, was für UserManager.PasswordHasher.HashPassword() unter der Haube ist. Zum Beispiel, wenn sie immer das gleiche Salz für einen bestimmten Benutzer verwenden (schlechte Sicherheitsvorkehrung), dann würde es vielleicht funktionieren, aber ich weiß nicht, ob das der Fall ist. – TheGreatContini

Verwandte Themen