English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

DEFAULT реализация и использование IPasswordHasher в Microsoft.Identity в Asp.net

Думаю, те, кто熟悉 MS Identity认证 системы, знают роль UserManager, он является координатором в системе, он определяет набор пользовательских действий, которые помогают нам управлять пользовательской информацией, информацией о ролях, обрабатывать пароли и т.д. Его реализация находится в UserStore, где мы можем реализовать его для нас определенный, например, IUserStore, IUserPasswordStore, IRoleStore и т.д. Мы можем на основе整套 пользовательских действий自定义 свои пользовательские данные и структуру данных, а также хранение данных. Что касается Password Hasher, MS предоставляет нам полный набор определений поведения, и его управление осуществляется UserManager. Например

UserManager.PasswordHasher.HashPassword(password)

PasswordHasher определен в интерфейсе UserManager следующим образом:

Меня изначально не интересовала его стандартная реализация, так как я需要一个 независимый проект для аутентификации пользователей для целей независимой аутентификации нескольких приложений, который производит токены, и после успешной аутентификации пользовательский HTTP Request Header Authorization содержит token для доступа к различным ресурсам на сервере приложения.

Вот почему в нескольких приложениях при проверке паролей出现了 такая проблема:

Например, приложение A использует реализацию IPasswordHasher для自定义ного способа шифрования - MD5 + salt, а приложение B использует стандартный PasswordHasher от Identity, и код, полученный после декомпиляции, следующий:

Так как для обеспечения совместимости с различными способами шифрования в различных приложениях, мне пришлось декомпилировать исходный код, получить его стандартный способ шифрования, на основе различных имен приложений, определить шифрование или дешифрование пароля, или напрямую сравнить пароль, введенный пользователем, с паролем в базе данных. Начнем с конкретного реализация MS стандартного PasswordHasher

// Декомпилирован с помощью JetBrains decompiler
// Тип: Microsoft.AspNet.Identity.Crypto
// Ассембли: Microsoft.AspNet.Identity.Core, Версия=2.0.0.0, Культура=нейтральная, PublicKeyToken=31bf3856ad364e35
// MVID: E3A10FFD-023A-4BC3-AD53-32D145ABF1C9
// Assembly location: C:\Sport\NewProject\V2.0\Api\Fantasy.Sport\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll
using System;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
namespace Microsoft.AspNet.Identity
{
 internal static class Crypto
 {
 private const int PBKDF2IterCount = 1000;
 private const int PBKDF2SubkeyLength = 32;
 private const int SaltSize = 16;
 public static string HashPassword(string password)
 {
  if (password == null)
  throw new ArgumentNullException("password");
  byte[] salt;
  byte[] bytes;
  using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 16, 1000))
  {
  salt = rfc2898DeriveBytes.Salt;
  bytes = rfc2898DeriveBytes.GetBytes(32);
  }
  byte[] inArray = new byte[49];
  Buffer.BlockCopy((Array) salt, 0, (Array) inArray, 1, 16);
  Buffer.BlockCopy((Array) bytes, 0, (Array) inArray, 17, 32);
  return Convert.ToBase64String(inArray);
 }
 public static bool VerifyHashedPassword(string hashedPassword, string password)
 {
  if (hashedPassword == null)
  return false;
  if (password == null)
  throw new ArgumentNullException("password");
  byte[] numArray = Convert.FromBase64String(hashedPassword);
  if (numArray.Length != 49 || (int) numArray[0] != 0)
  return false;
  byte[] salt = new byte[16];
  Buffer.BlockCopy((Array) numArray, 1, (Array) salt, 0, 16);
  byte[] a = new byte[32];
  Buffer.BlockCopy((Array) numArray, 17, (Array) a, 0, 32);
  byte[] bytes;
  using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, 1000))
  bytes = rfc2898DeriveBytes.GetBytes(32);
  return Crypto.ByteArraysEqual(a, bytes);
 }
 [MethodImpl(MethodImplOptions.NoOptimization)]
 private static bool ByteArraysEqual(byte[] a, byte[] b)
 {
  if (object.ReferenceEquals((object) a, (object) b))
  return true;
  if (a == null || b == null || a.Length != b.Length)
  return false;
  bool flag = true;
  for (int index = 0; index < a.Length; ++index)
  flag &= (int) a[index] == (int) b[index];
  return flag;
 }
 }
}

Кто-то может спросить, как использовать эти исходные коды. Ниже кратко рассмотрим这个问题.

Вначале я наивно думал, что это всего лишь шифрование, зачем его тщательно читать, просто используй его?

При регистрации пользователей и изменении пароля шифрование пароля выполняется через метод HashPassword, поэтому в новом пользовательском PasswordHasher я, чтобы сравнить пароль входа пользователя, просто шифрую ввод пользователя с помощью HashPassword. Почему бы и нет? Поэтому я создал пользовательский метод VerifyHashedPassword (Verify переводится как проверка), который сравнивает сохраненный в базе данных пароль Pwd и результат处理后 хеширования. Но результат, что каждый раз для одного и того же строки генерируется различный результат шифрования, это не так, как раньше с md5 + salt. Поэтому я снова подумал о методе VerifyHashedPassword по умолчанию.

Итак, в заключение можно сказать, что вы можете использовать способ шифрования Microsoft Identity (Hasher, указанный выше) напрямую, когда сравниваете ввод пользователя и сохраненный в базе данных результат хеширования, используйте метод VerifyHashedPassword(). Даже если не использовать аутентификацию Identity, можно использовать этот шифровальный алгоритм

Вот и все, что было в этой статье, надеюсь, что контент этой статьи поможет вам в изучении или работе, и также надеюсь, что вы будете активно поддерживать呐喊 руководства!

Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не обладает правами собственности, не undergone редактирование вручную, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите, что содержится подозрительное нарушение авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. При подтверждении, сайт немедленно удалят подозрительное контент, нарушающее авторские права.

Основной учебник
Рекомендуем к просмотру