2016-09-07 1 views
0

J'ai une API Web ASP.NET qui utilise ASP.NET Identity v2.2.1 pour gérer les utilisateurs. Je suis capable d'ajouter/modifier des utilisateurs sans problème. Cependant, j'ai un deuxième projet qui ne peut pas utiliser l'API mais doit pouvoir changer un mot de passe Users directement via la base de données.Mot de passe de hachage manuel identique à ASP.NET Identity v2.2.1

J'essaie de comprendre comment hacher le mot de passe entré par l'utilisateur sans passer par l'API. Je dois m'assurer que j'utilise le même algorithme de hachage qu'utilise ASP.NET Identity. Je suis tombé sur du code dans this SO article mais je ne suis pas sûr si c'est le même algorithme de hachage utilisé par v2.2.1.

using using System.Security.Cryptography; 

public static string HashPassword(string password) 
{ 
    private const int PBKDF2IterCount = 1000; // default for Rfc2898DeriveBytes 
    private const int PBKDF2SubkeyLength = 256/8; // 256 bits 
    private const int SaltSize = 128/8; // 128 bits 

    if (password == null) 
    { 
     throw new ArgumentNullException("password"); 
    } 

    // Produce a version 0 (see comment above) text hash. 
    byte[] salt; 
    byte[] subkey; 
    using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount)) 
    { 
     salt = deriveBytes.Salt; 
     subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength); 
    } 

    var outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength]; 
    Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize); 
    Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength); 
    return Convert.ToBase64String(outputBytes); 
} 

Je voudrais éviter d'avoir à ajouter ASP.NET identité comme une dépendance à ce projet donc pourquoi je voudrais hash le mot de passe manuellement.

+0

Êtes-vous toujours une solution? – trailmax

Répondre

0

Je vous recommande d'utiliser SimpleCrypto

Voilà comment je l'ai utilisé que dans un projet, je crois que cela va vous aider. On peut ajouter cette DLL de nuget

  [HttpPost] 
    public ActionResult Register(RegisterViewModel model) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       { 
        var crypto = new SimpleCrypto.PBKDF2(); 
        var encrypPass = crypto.Compute(model.Password); 
        var newUser = db.Users.Create(); 
        newUser.Email = model.Email; 
        newUser.Password = encrypPass; 
        newUser.PasswordSalt = crypto.Salt; 
        // newUser.Name = model.UserName; 
        newUser.Username = model.UserName; 
        //newUser.AddedBy = model.; 
        db.Users.Add(newUser); 
        db.SaveChanges(); 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", ""); 
      } 
     } 
     catch (DbEntityValidationException e) 
     { 
      foreach (var eve in e.EntityValidationErrors) 
      { 
       Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
        eve.Entry.Entity.GetType().Name, eve.Entry.State); 
       foreach (var ve in eve.ValidationErrors) 
       { 
        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
         ve.PropertyName, ve.ErrorMessage); 
       } 
      } 
      throw; 
     } 

     return View(); 
    } 

Votre chèque valide à la connexion sera comme ça

 private bool IsValid(string email, string password) 
    { 
     var crypto = new SimpleCrypto.PBKDF2(); 
     bool isValid = false; 

     { 
      var user = db.Users.FirstOrDefault(u => u.Email == email); 
      if (user != null) 
      { 
       if (user.Password == crypto.Compute(password, user.PasswordSalt)) 
       { 
        isValid = true; 
       } 
      } 
     } 
     return isValid; 
    } 
+0

Seule l'identité stocke le mot de passe et le sel dans le même champ de la base de données. Donc vous devrez en tenir compte. Et cette question est vieille d'un mois - je pense que le PO a déjà trouvé la solution. – trailmax