2017-07-21 18 views
0

古いWebサイトから従来のASPからASP.NETコアへのアップグレードに取り組んでいます。これの一部は、(パスワードが平文で自然に格納されている)ユーザーをIdentityに移行することです。私たちはユニットテストプロジェクトを使ってマイグレーションを処理していますが、そのプロジェクトはアイデンティティにアクセスできません。社内認証からASP.NETコアIDへの移行

ここで最適なオプションは何ですか?私が目にする主な問題は、パスワードを正しい形式にすることですが、ASP.NET Identityのソースを見て、移行のすべてを適切にハッシュする機能を模倣できると思います。より良い方法がありますか?

答えて

1

ASP.NET ID 3で使用されるハッシュアルゴリズムはhereです。ただし、依存関係をプロジェクトにコピーしない限り、はASP.NET Idetity以外で実行することはできません。

HashPasswordV3

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; 
} 

VerifyHashedPasswordV3

private static bool VerifyHashedPasswordV3(byte[] hashedPassword, string password, out int iterCount) 
{ 
    iterCount = default(int); 

    try 
    { 
     // Read header information 
     KeyDerivationPrf prf = (KeyDerivationPrf)ReadNetworkByteOrder(hashedPassword, 1); 
     iterCount = (int)ReadNetworkByteOrder(hashedPassword, 5); 
     int saltLength = (int)ReadNetworkByteOrder(hashedPassword, 9); 

     // Read the salt: must be >= 128 bits 
     if (saltLength < 128/8) 
     { 
      return false; 
     } 
     byte[] salt = new byte[saltLength]; 
     Buffer.BlockCopy(hashedPassword, 13, salt, 0, salt.Length); 

     // Read the subkey (the rest of the payload): must be >= 128 bits 
     int subkeyLength = hashedPassword.Length - 13 - salt.Length; 
     if (subkeyLength < 128/8) 
     { 
      return false; 
     } 
     byte[] expectedSubkey = new byte[subkeyLength]; 
     Buffer.BlockCopy(hashedPassword, 13 + salt.Length, expectedSubkey, 0, expectedSubkey.Length); 

     // Hash the incoming password and verify it 
     byte[] actualSubkey = KeyDerivation.Pbkdf2(password, salt, prf, iterCount, subkeyLength); 
     return ByteArraysEqual(actualSubkey, expectedSubkey); 
    } 
    catch 
    { 
     // This should never occur except in the case of a malformed payload, where 
     // we might go off the end of the array. Regardless, a malformed payload 
     // implies verification failed. 
     return false; 
    } 
} 
0

あなたは、単に現在のデータベースから各ユーザーをロードし、アイデンティティにUserManagerクラスを使用して新しいデータベースに追加することができるようにパスワードが平文であります。

UserManagerクラスには、パスワードを取り、ハッシングを処理するCreateAsyncメソッドがあります。

例:

var user = new IdentityUser // or whatever your user class is 
{ 
    UserName = userName, 
    Email = email, 
    // set other required properties 
}; 

var result = await userManager.CreateAsync(user, password); 

私は、1回のタスクとして別のプログラムでこれを実行し、手動で推薦します。この手順は、新しいアプリでは生き残らないようにしてください。

関連する問題