2017-12-24 38 views
0

AspNetUserテーブルではなく、学生テーブルを使用するようにAsp.Net Coreをカスタマイズしました。新しいものはすべてうまくいく。しかし、既存の生徒のパスワードを更新する必要があります。これは一回ごとに学生のログインまたは行うことができるとき、私はAsp.NetコアID、既存のプレーンテキストパスワードを更新

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 
{ 
    ViewData["ReturnUrl"] = returnUrl; 
    if (ModelState.IsValid) 
    { 
     // Require the user to have a confirmed email before they can log on. 
     var user = await _userManager.FindByEmailAsync(model.Email); 
     if (user != null) 
     { 
      if (user.PasswordHash == null) 
      { 
       user.EmailConfirmed = true; 
       user.UserName = model.Email; 
       user.NormalizedEmail = model.Email.ToUpper(); 
       user.NormalizedUserName = user.NormalizedEmail; 
       //user.PasswordHash = ?; 
       //user.SecurityStamp = ?; 
       //update user in database. 
      } 
      //continue on with login process 
     } 
    } 
} 

Register法から)以下のコードは、新しいユーザーを作成します...(AccountControllerLogin方法で)このような何かをしたいと思います彼をデータベースに追加します。これは私たちが望むものではありません。

var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
var result = await _userManager.CreateAsync(user, model.Password); 
if (result.Succeeded) 
    // … 
+0

パスワードハッシュが明らかに「null」の場合、ユーザーはどのようにログインする必要がありますか?ユーザーが使用しているパスワードは何ですか?そして、それが実際のユーザーであることをどのように確認しますか? – poke

+1

パスワードを変更する必要があるすべてのユーザーをロックアウトし、「パスワードを忘れた」リンクを使用して新しいパスワードを要求する必要があることを説明してください。こうすることで、Identityはパスワードリセットトークンを生成し、ユーザーは自分のパスワードを適切に設定することができます。 – poke

+0

生徒はプレーンテキストのパスワードでログインします。電子メールとパスワードが一致している場合、少なくとも過去にあったレベルまで権限のあるユーザーであることがわかります。 - このコードは、Identityシステムがパスワードハッシュをチェックしているところに到達する前です。私がこの作業を行うことができれば、その変更はユーザーにとって完全に透過的になります。 –

答えて

0

あなたはUserManagerは、ユーザーのパスワードを設定する必要があるものを持っています。内部パスワードハッシャーを直接使用することもできますが、ユーザーマネージャーを経由することで、ユーザーエンティティーがパスワードに関して適切に更新されるようになります。だから、あなたは "正しいことをする"ためにユーザーマネージャーに頼ることができます。

var user = await _userManager.FindByEmailAsync(model.Email); 
if (user != null && !(await _userManager.HasPasswordAsync(user))) 
{ 
    // retrieve plaintext password 
    var originalPassword = GetPlainTextPassword(user); 

    var result = await _userManager.AddPasswordAsync(user, originalPassword); 

    if (!result.Succeeded) 
    { 
     // handle error 
    } 
} 

そうでない場合、あなたはまた、パスワードリセットの流れを利用することができ、あなたが、その後すぐにリセットするために使用するトークンを生成する:ユーザーがパスワードを持っていない場合

、あなたはそれを設定するためにAddPasswordAsyncを使用することができますユーザーのパスワード(実際にユーザーを関与させずに)基本的にはGeneratePasswordResetTokenAsyncResetPasswordAsyncのチェーンになります。もちろん、これは唯一のメンテナンス上の理由のために行われるべきである。

var user = await _userManager.FindByEmailAsync(model.Email); 
if (user != null) 
{ 
    // retrieve plaintext password 
    var originalPassword = GetPlainTextPassword(user); 

    // retrieve token 
    var resetToken = await _userManager.GeneratePasswordResetTokenAsync(user); 

    // reset password 
    var result = await _userManager.ResetPasswordAsync(user, resetToken, originalPassword); 

    if (!result.Succeeded) 
    { 
     // handle error 
    } 
} 

かかわらず、このの、私はまだあなたが積極的にがパスワードに自分自身をリセットするためにユーザーに要求することをお勧め。プレーンテキストのパスワードをデータベースから削除し、空のパスワードを保持してください。そうすれば、ユーザーは最初にパスワードをリセットする必要があります(最初のログイン前にパスワードを入力する必要があることを説明するためにメモを追加する必要があります)。nobodyは新しいパスワードをプレーンテキストで見ることができます。 - 古いパスワードはデータベースに公開されており、(おそらくは?!)多数のバックアップがあり、システムが安全だと思っても完璧ではない可能性があります。また、依然として関係者がデータベースにアクセスし、これらのパスワードを他の人に直接的または間接的に公開することができます(良好な目的の有無にかかわらず)。何も間違ってはならないほどシステムを信頼してはいけません。ユーザーは、パスワードを安全に保つことであなたを信頼する必要はありません。新しいパスワードを作成し、古いパスワードを取り除くように伝えてください。これは後の方が早いでしょう。

+1

ありがとうございます。私はこれがうまくいくと思います。また、ユーザーが明示的にパスワードをリセットしたことを私に納得させました。さらに強力なパスワードの要件を満たすことができます。 –

関連する問題