2016-07-06 8 views
5

Orijinal bir ASP.NET Core uygulaması tarafından oluşturulan Microsoft Identity tablolarıyla var olan bir SQL veritabanımız var.Varolan Microsoft Kimlik kullanıcı tablolarını yeniden kullanırken parola (hash) eşleşmiyor

Ayrıca Microsoft Kimlik kullanan bir ASP.NET 4 uygulamasına da sahibiz.

ASP.NET 4 uygulamasının kimlik doğrulama girişlerini orijinal .NET Core uygulamasıyla aynı veritabanı kullanarak gerçekleştirmesini isterdik. Ancak, parolaları doğrulamaya çalıştığımızda, eşleşmiyorlar.

Sadece .NET Core uygulaması tarafından oluşturulan şifre karmalarının ASP.NET 4 uygulaması tarafından doğrulanamayacağını tahmin ediyorum, ancak buradan nereye gideceğimi bilmiyorum. :)

.NET Core uygulamasında özel bir şifre karmaşası yok ve hashing'i etkileyebilecek herhangi bir yapılandırma bulmaya çalışıyorum.

Herhangi bir yardım veya işaretçi büyük beğeni topluyor!

Düzeltme: Kimlik V2/V3'teki farklı karma algoritmalardan kaynaklanmış gibi görünüyor. Yine de, ASP.NET 4 uygulamasında V3 karma algoritmasını nasıl taklit edeceğinizden emin değilsiniz. bulunan belgelere gereğince

cevap

4

: - belki birinde sürüm 2 formatını kullanıyor ve diğer sürüm 3 formatını Bir noktada https://github.com/aspnet/Identity/blob/a8ba99bc5b11c5c48fc31b9b0532c0d6791efdc8/src/Microsoft.AspNetCore.Identity/PasswordHasher.cs

/* ======================= 
    * HASHED PASSWORD FORMATS 
    * ======================= 
    * 
    * Version 2: 
    * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations. 
    * (See also: SDL crypto guidelines v5.1, Part III) 
    * Format: { 0x00, salt, subkey } 
    * 
    * Version 3: 
    * PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, 10000 iterations. 
    * Format: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey } 
    * (All UInt32s are stored big-endian.) 
    */ 

, kimlik, farklı bir karma algoritması kullanılır?

Sınıfın kurucusu seçenekleri alır, doğru kareyi almak için bunu ayarlamayı deneyebilirsiniz?

public PasswordHasher(IOptions<PasswordHasherOptions> optionsAccessor = null) 

DÜZENLEME:

burada Kimlik v2.0 kaynağını bulduk: https://aspnetidentity.codeplex.com/ ve git repo: https://git01.codeplex.com/aspnetidentity

kaynak üzerinden baktığımızda, onun özetleme yöntemi rastlamak. aspnet kimlik çekirdekte v2 ile karşılaştırıldığında

Crypto.HashPassword.cs

public static string HashPassword(string password) 
    { 
     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); 
    } 

:

private static byte[] HashPasswordV2(string password, RandomNumberGenerator rng) 
    { 
     const KeyDerivationPrf Pbkdf2Prf = KeyDerivationPrf.HMACSHA1; // default for Rfc2898DeriveBytes 
     const int Pbkdf2IterCount = 1000; // default for Rfc2898DeriveBytes 
     const int Pbkdf2SubkeyLength = 256/8; // 256 bits 
     const int SaltSize = 128/8; // 128 bits 

     // Produce a version 2 (see comment above) text hash. 
     byte[] salt = new byte[SaltSize]; 
     rng.GetBytes(salt); 
     byte[] subkey = KeyDerivation.Pbkdf2(password, salt, Pbkdf2Prf, Pbkdf2IterCount, Pbkdf2SubkeyLength); 

     var outputBytes = new byte[1 + SaltSize + Pbkdf2SubkeyLength]; 
     outputBytes[0] = 0x00; // format marker 
     Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize); 
     Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, Pbkdf2SubkeyLength); 
     return outputBytes; 
    } 

Kimlik v2 karma ve kimlik çekirdek v2 karma şimdi kimlik çekirdek v3 karma kıyasla oldukça benzer görünüyor :

private static byte[] HashPasswordV3(string password, RandomNumberGenerator rng, KeyDerivationPrf prf, int iterCount, int saltSize, int numBytesRequested) 
    { 
     // Produce a version 3 (see comment above) text hash. 
     byte[] salt = new byte[saltSize]; 
     rng.GetBytes(salt); 
     byte[] subkey = KeyDerivation.Pbkdf2(password, salt, prf, iterCount, numBytesRequested); 

     var outputBytes = new byte[13 + salt.Length + subkey.Length]; 
     outputBytes[0] = 0x01; // format marker 
     WriteNetworkByteOrder(outputBytes, 1, (uint)prf); 
     WriteNetworkByteOrder(outputBytes, 5, (uint)iterCount); 
     WriteNetworkByteOrder(outputBytes, 9, (uint)saltSize); 
     Buffer.BlockCopy(salt, 0, outputBytes, 13, salt.Length); 
     Buffer.BlockCopy(subkey, 0, outputBytes, 13 + saltSize, subkey.Length); 
     return outputBytes; 
    } 

Neler olup bittiğini anlamak için yapmıyorum hese yöntemleri, ancak kimlik v2 ve kimlik çekirdeğinden, parametresiz bir yapıcıdan, yapılandırma seçeneklerini alan bir tanesine gittik. V2, SHA1 kullanır, V3 SHA256'yı kullanır (başka şeylerin yanı sıra).

Varsayılan olarak kimlik çekirdeği, kimliğin eski sürümünde mevcut olmayan V3 yöntemini kullanıp, sorununun nedeni olabilir.Yukarıdaki kaynağı

https://github.com/aspnet/Identity/blob/a8ba99bc5b11c5c48fc31b9b0532c0d6791efdc8/src/Microsoft.AspNetCore.Identity/PasswordHasherOptions.cs

Not, V3, varsayılan olarak kullanılır. o eski yöntem uygulanmadı gibi kimlik çekirdeğinde karma edildi şifreleri, kimlik eski sürümünde aynı karma anlamına gelir gibi

/// <summary> 
    /// Gets or sets the compatibility mode used when hashing passwords. 
    /// </summary> 
    /// <value> 
    /// The compatibility mode used when hashing passwords. 
    /// </value> 
    /// <remarks> 
    /// The default compatibility mode is 'ASP.NET Identity version 3'. 
    /// </remarks> 
    public PasswordHasherCompatibilityMode CompatibilityMode { get; set; } = PasswordHasherCompatibilityMode.IdentityV3; 

Ne yazık ki görünüyor. Belki de v3'te neler yapıldığını taklit edebilirsin?

+0

Tek, PasswordHasher sınıfı yalnızca parametresiz bir kurucuya sahip görünüyor. Ancak bir sürüm farkı bunu açıklayabilir, Core uygulaması Identity 3'te, ASP.NET 4 uygulaması ise Identity 2'de. V3'ün .NET 4.6.1 için mevcut olduğundan emin değil misiniz? –

+0

Şu anda ASP.NET 4 uygulamasına V3 karma algoritmasını aktarmayı düşünüyorum. Aksi takdirde Core uygulamasının V2 hashing'i kullanmak için değiştirilebileceğini tahmin ediyorum (temelde geçerli V3 karmalarını V2 karmalarına geçiriyorum), ama V3'te kalmayı tercih ederim. Yardımın için çok teşekkürler! –