2016-09-07 7 views
0

У меня есть ASP.NET Web Api, который использует ASP.NET Identity v2.2.1 для управления пользователями. Я могу добавлять/редактировать пользователей без проблем. Однако у меня есть второй проект, который не может использовать API, но должен иметь возможность изменять пароль Users напрямую через базу данных.Пароль для хэширования вручную аналогичен паролю ASP.NET v2.2.1

Я пытаюсь выяснить, как ввести пароль, введенный пользователем, не пройдя через API. Мне нужно убедиться, что я использую тот же алгоритм хэширования, который использует ASP.NET Identity. Я натолкнулся на некоторый код в this SO article, но я не уверен, что это тот же алгоритм хэширования, который используется 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); 
} 

Я хотел бы избежать того, чтобы добавить ASP.NET Идентичность как зависимость этого проекта, следовательно, почему я хотел бы hash пароль вручную.

+0

Вы все еще ищете решение? – trailmax

ответ

0

Я бы порекомендовал вам использовать SimpleCrypto

Это, как я использовал, что в проекте я считаю, что это поможет. Можно добавить этот DLL из 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(); 
    } 

действительного чека на входе будет как этот

 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

Только Identity хранит хэш и соль в одном поле в БД. Поэтому вам нужно будет это учесть. И этот вопрос уже месяц - я думаю, что ОП уже нашел решение. – trailmax