0

パスワードの有効期限が切れた後にユーザーがパスワードを変更するときに、(WebMatrix で) if ブランチを使用して新しいパスワードが以前のパスワードと等しくないことを確認する方法を知りたいと思っていました。

最後に使用したパスワード以外のパスワードの履歴を確認する必要はないと思うので、以前のパスワードを確認できれば問題ないと思います。

もちろん、データベースにクエリを実行して確認することもできますが、パスワードがプレーン テキストで保存されないため、これが機能しないことはわかっていますが、ここで WebSecurity メソッドも確認しました。

http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity(v=vs.111).aspx

何も見つかりませんでした。

これを行うための最良の方法は何ですか?

4

3 に答える 3

1

パスワードはデータベースに保存されないため、ユーザーが最初に登録したとき、およびその後ユーザーがパスワードを変更したときにパスワードをメモしない限り、これを行う方法はありません。

ここでの皮肉なことに、元のパスワードを(暗号化された状態でも)保存すると、実際にはアプリケーションのセキュリティが低下します。

于 2012-10-29T16:17:15.033 に答える
1

興味のある方のために、私はこの質問に対する素晴らしい回避策を見つけました。それは仕事をうまくやり遂げます。

ただし、これは彼らが持っていた/持っていた最後のパスワードをチェックするためにのみ機能することに注意してください.

これは私が実装したものです:

もちろん、最初に、他のコードの中でも特にログインページで、実際にログインした後、明らかなことがあります(パスワードが6か月以上前のものであり、変更が必要かどうかを確認するため):

if(WebSecurity.GetPasswordChangedDate(username).AddMonths(6) < DateTime.UtcNow)
{
    WebSecurity.Logout();
    Session["gActionMessage"] = "Your password has expired. Please change your password by visiting \"Login\" then \"Change Password\"";
    Session["gActionMessageDisplayed"] = "not";
    Response.Redirect("~/");
}

次に、「パスワードの変更」ページでこれを思いつきました(実際には、パスワードリセットトークンの電子メール検証後にリダイレクトされたページですが、アイデアはわかります):

if(WebSecurity.Login(email, newPassword, false) && WebSecurity.UserExists(email) && WebSecurity.GetPasswordChangedDate(email).AddMonths(6) < DateTime.UtcNow)
{
    WebSecurity.Logout();
    errorMessage = "You cannot repeat your last expired password.";
}

ここの if ブランチは 3 つのチェックを行います。

まず、新しいパスワードとして入力したものに基づいて、可能であれば効果的にチェックしてログインします。

次に、ユーザーが存在するかどうかを確認します(これが必要かどうかはわかりませんが、何でも)。

そして最後に、パスワードの変更日が 6 か月以上前のものであることを確認します (同じページが「パスワードを忘れた」ものに使用されるため、この方法でエラーが発生する前に適切な状況が満たされていることが保証されます)。

つまり、新しいパスワードでログインするのに十分な場合 (もちろん、実際に変更される前に)、パスワードを変更する代わりに、パスワードを変更してからログアウトし、エラー メッセージを表示します。ログインするのに十分でない場合は、パスワードを繰り返すことはできず、(他の要件を満たしている限り) パスワードが変更されます。

これが、将来、パスワードの変更時に WebMatrix を使用して繰り返されないパスワードを必要とする可能性があるすべての人に役立つことを願っています!

于 2012-10-29T18:23:41.037 に答える
0

System.Web.Helpers アセンブリを参照し、

「PasswordVersion」列にインクリメントされたバージョン番号を持つ「Password」列に格納されたハッシュ化されたパスワードを含む「UserPasswordHistory」というカスタム テーブルを作成します。このテーブルの行は、ユーザーが登録されるか、特定のパスワードが更新されるたびに挿入されます。ユーザー、次のコードが機能します。

var userProfile = db.UserProfiles.First(x => x.UserId == userId);
                var passwords = (userProfile.UserPasswordHistory
                                          .OrderByDescending(x => x.PasswordVersion)
                                          .Take(_configuration.PasswordCountBeforeReuseAllowed))
                                          .Select(x => x.Password);

return passwords.Any(previousPassword => Crypto.VerifyHashedPassword(previousPassword, password));

具体的に尋ねられた質問に答えるには、_configuration.PasswordCountBeforeReuseAllowed を 1 に設定します。

于 2015-11-13T15:13:04.217 に答える