11

90 日後にユーザーにパスワードの変更を強制する必要があります。これは、次のようなものでうまく機能しています。

if (memberUser.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date)
{
     return RedirectToAction("MyChangePasswordMethod", "MyController");
}

ただし、ユーザーが使用した最後の 5 つのパスワードを繰り返すことができないという別の要件があります。asp.net には、このようなものが組み込まれていますか? 前回のパスワードが保存されている aspnet db テーブルに何も表示されません。最後のパスワード値を自分の db テーブルに保存し、入力した新しいパスワード フィールドと自分のカスタム db テーブルのユーザーの値を比較するのは問題でしょうか?

4

1 に答える 1

18

お気づきのように、何も組み込まれていないため、ユーザーの以前のパスワードを保存する必要があります-それらがハッシュまたは暗号化されていることを確認し、そのリストをチェックして、それらが再利用されていないことを確認します. ハッシュ/暗号化に同じソルトを使用していることを確認してください。そうしないと、同じパスワードに一致することはありません。

以前のパスワードをすべて保存します。これは、5 つの変更に達したときにテーブルから古いデータを消去する必要がないことを意味します。最後の 10 または 15 の変更を再利用しないように要件が変更された場合でも、データは保持されます。パスワードが変更された日付も保存する場合は、代わりに、過去 12 か月間再利用がないことを示すチェックを組み込むことができます。

ハッシュ化/暗号化されたパスワードを保存し、それに対してチェックしているため、システムからプレーンテキストバージョンを取得する可能性はありません.

「UserId」、「Password」、「DateChanged」のテーブルが必要です。次に、このユーザーの最後の N 個のパスワードを見つけて、新しいパスワードのハッシュ化/暗号化されたバージョンをこのリストと比較できます。

var encryptedPassword = MembershipProvider.EncryptPassword(password);
int numberOfReuse = 5;  // or configurable
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>()
                      where histories.UserId == userId
                      orderby histories.PasswordDate descending
                      select histories.Password).Take<string>(numberOfReuse);

return historiesQuery.Contains<string>(enycryptedPassword);

パスワードがすでに使用されている場合、これは true を返します。

日付ベースのチェックを行うには:

var encryptedPassword = MembershipProvider.EncryptPassword(password);
DateTime testDate = DateTime.Now.AddMonths(-12);  // configurable
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>()
                      where histories.UserId == userId
                      and histories.PasswordDate >= testDate
                      orderby histories.PasswordDate descending
                      select histories.Password);

return historiesQuery.Contains<string>(enycryptedPassword);
于 2013-02-25T11:04:24.830 に答える