2016-08-28 13 views
0

現在Azureで動作しているサーバーを書き直すように指示されました。このサーバーは非常にひどく書かれており、ひどく設計されたAPIを公開しており、全体的にモデル設計自体はサブパネルでした。ASP.NET ID EFユーザーを新しいデータベースに移動する

私の仕事は、主にこれを合理化し、機能を削除し、新しい機能を追加することでした。これにより、まもなく導入する必要がある新しいサーバーが生まれました。

ただし、クライアントは現在のユーザーベースを保持します。現在の設計は単純です:アイデンティティユーザーはわずかにカスタマイズされています(追加するIDを追加すると削除されます)。実際のユーザーデータは別のモデルで別のテーブルに保存されます(追加されたIDはこのモデルの参照です)。

ユーザーを統一し、UserName、Emailプロパティ、および可能であればパスワードを保存したいと考えています。しかし、私はハッシュのために後者が可能ではないと思う。

これを行う簡単な方法はありますか、または単にこれらのプロパティをエクスポートして新しいパスワードで新しいユーザーを作成する必要があります(もちろん、パスワードを変更する必要があることを電子メールで通知します)。

+0

マイグレーション後に同じハッシングアルゴリズムを使用してパスワードを確認し、次回のログイン時に新しいパスワードを作成するように指示される何らかの安全性チェックを実装できますか?処理が完了するまで、別の列に新しいパスワードを保存することができます。 – Robert

+0

ハッシュアルゴリズムは、最初に実行したときにハッシュソルトを生成するビルトインアルゴリズムです(存在しない場合)。しかし、私はそれがどこに保存されているかわからない。私は新しいサーバーコードがそれを複製できるとは思わない。 – fonix232

答えて

0

アクセスが許可されているメソッドは、ApplicationOAuthProvider.GrantResourceOwnerCredentialsのようにオーバーライドできます。

古いパスワードとオプションの追加情報を使用してapplicationuserを拡張します。すべてのユーザーをユーザー表に追加して、(新規)パスワード・フィールドを空白のままにします。

アイデアは単純です:ユーザーは資格情報を送信します。古いパスワードに値がある場合は、古い確認を使用して確認します。成功すると、ユーザーは名前のみで検索されます(ユーザーは一意であり、検証されています)。指定されたパスワードでパスワードをリセットし、古いパスワードフィールドをクリアします。

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    internal async Task<IdentityResult> ResetOldPassword(ApplicationUser user, string newPassword) 
    { 
     var passwordStore = Store as IUserPasswordStore<ApplicationUser, string>; 
     if (passwordStore == null) 
      throw new Exception("UserManager store does not implement IUserPasswordStore"); 

     var result = await base.UpdatePassword(passwordStore, user, newPassword); 
     if (result.Succeeded) 
     { 
      user.OldPassword = null; 
      result = await base.UpdateAsync(user); 
     } 
     return result; 
    } 
} 

ユーザーの資格情報を変更する必要はありません。すべてのパスワードが変換された後、または一定期間後にコンバージョンコードを削除することができます。

+0

残念ながら、パスワードチェックは、ASP.NET ID 2.0で使用されるデフォルトです。これは、コードの最初の実行時に生成されたカスタム塩を含むハッシュアルゴリズムを使用します。私のコードは既存のサーバーを置き換えるので、ハッシュソルトが変更され、古いアルゴリズムは使用できなくなります。 – fonix232

+0

古いsalt/paswordでログインを確認するだけです。だからあなたは塩/パスワードハッシュで元のユーザーテーブルが必要になります。これを別のスキームやデータベースに保存することもできます。ログイン時にまず「古い」データベースに接続してユーザーを確認します。新しいデータベースに正常に接続した場合は、前述の手順を実行します。 ResetOldPasswordを使用して新しいsalt/passwordを生成します。 「古い」モデルのユーザーを変換したものとしてマークします。 –

+0

新しいユーザーテーブルで、PasswordHashとSecurityStampを空のままにします。 ResetOldPasswordは、新しいパスワード(実際には '古い'データベースの現在のパスワード)に基づいてこれらのフィールドを更新します。 –

関連する問題