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

Implementazione predefinita e applicazione di IPasswordHasher di Microsoft.Identity in Asp.net

// Chi ha familiarità con il sistema di autenticazione MS Identity sa l'importanza di UserManager. È il coordinatore dell'intero sistema, definisce un set di comportamenti utente per aiutarci a gestire le informazioni utente, le informazioni di ruolo e gestire le password. La sua implementazione è nel UserStore, dove possiamo implementare ciò che abbiamo definito come IUserStore, IUserPasswordStore, IRoleStore, ecc. Possiamo basarci su un insieme di comportamenti utente per definire le nostre informazioni utente e la struttura dei dati, nonché il deposito dei dati. Quindi, riguardo al Hasher delle Password, MS ci fornisce una definizione completa del comportamento, che viene coordinato dal UserManager. Ad esempio

UserManager.PasswordHasher.HashPassword(password)

// La PasswordHasher è definita nell'interfaccia UserManager come segue:

// Non ero interessato all'implementazione predefinita, ma per il fine di avere un'autenticazione di login indipendente per diverse applicazioni, ho bisogno di un progetto di autenticazione utente indipendente come servizio di autenticazione, che produce token e, una volta autenticato, l'utente può accedere a vari risorse del server applicativo tramite l'header Authorization dell'HTTP Request con il token.

// A causa di questo, è sorto questo problema nel riconoscimento delle password in più applicazioni:

// Ad esempio, l'applicazione A utilizza l'implementazione IPasswordHasher per definire un metodo di crittografia personalizzato nel formato MD5+salt, mentre l'applicazione B utilizza il PasswordHasher predefinito di Identity. Ecco il codice ottenuto tramite decompilazione:

// Permette di essere compatibile con diversi metodi di crittografia diversi per le applicazioni, devo decompilare il codice sorgente per ottenere il metodo di crittografia predefinito, determinare se criptare o decrittare le password in base al nome dell'applicazione, o direttamente confrontare le password inserite dall'utente con il database. Ecco l'implementazione specifica di PasswordHasher predefinita di MS

// Decompiled with JetBrains decompiler
// Type: Microsoft.AspNet.Identity.Crypto
// Assembly: Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, 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;
 }
 }
}

Alcuni potrebbero chiedere come applicare questi sorgenti. Di seguito è riportato un breve riassunto di questo problema.

All'inizio pensavo che non fosse altro che una crittografia, non c'era bisogno di guardare attentamente, potevo usarla direttamente?

Quando si registra un utente o si modifica la password, l'加密 è fatto tramite il metodo HashPassword sopra menzionato. Quindi, nel mio nuovo PasswordHasher personalizzato, per confrontare la password di login dell'utente con l'app B, perché non crittografare direttamente l'input dell'utente tramite HashPassword? Quindi il mio metodo personalizzato VerifyHashedPassword (Verify tradotto come verificare) è confrontare se il Pwd nel database è uguale al risultato del trattamento hasher. Ma il risultato è che la stessa stringa produce risultati di crittografia diversi ogni volta, diverso dal vecchio md5+salt. Quindi ho pensato al metodo di implementazione predefinito VerifyHashedPassword.

Quindi, l'ultima cosa da dire è che puoi usare direttamente il metodo di crittografia di Microsoft Identity (Hasher sopra menzionato) e utilizzare il metodo VerifyHashedPassword () per confrontare l'input dell'utente con il risultato di hash memorizzato nel database. Puoi anche usare questo algoritmo di crittografia senza autenticazione Identity

Questo è tutto il contenuto dell'articolo, spero che il contenuto di questo articolo possa aiutarti a imparare o lavorare meglio, e spero anche di ricevere più supporto per il tutorial di urla!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è della proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di copyright, sei invitato a inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di copyright.

Ti potrebbe interessare