34

ウェブサイトにパスワードを忘れた機能を実装したいと考えています。しばらくすると期限切れになる一時的な 1 回限りの URL を含む電子メールがユーザーに送信されるオプションが気に入っています。

これらのアイデアを得るために次のページを見ましたが、ASP.NET と C# を使用してこれを実装する方法がわかりません。ユーザーの1人が指摘したように、この情報をデータベース内に保存せずにこれを実装できれば、それが理想的です。お知らせ下さい。

一時パスワードを電子メールで送信してパスワードをリセットする

ありがとう。

4

9 に答える 9

76

おそらく最も簡単な方法は、users テーブルを変更して 2 つの列を追加することです。または、既存のテーブルを変更したくない場合は、「UserPasswordReset」などと呼ばれる新しい依存テーブルを追加できます。列は次のようになります。

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

追加のテーブル ルートを使用する場合は、UserID 列を追加して、それを主キーおよびユーザー テーブルへの外部キー参照にすることもできます。UNIQUE 制約も推奨されます。次に、asp.net アプリケーションで Guid をトークンとして使用するだけです。

フローは次のようになります。

  1. ユーザーが自分のアカウントのパスワードのリセットを要求する
  2. PasswordResetExpiration を将来の日付 (DateTime.Now.AddDays(1)) に設定して、テーブルに新しいレコードを挿入 (またはユーザー レコードを更新) し、トークンを Guid.NewGuid() に設定します。
  3. クエリ文字列に GUID を含む ResetPassword.aspx ページへのリンクをユーザーにメールで送信します ( http://www.yoursite.com/ResetPassword.aspx?token=Guid-here )
  4. ResetPassword.aspx ページを使用して、トークンと有効期限のフィールドを検証します。(IE 確認 DateTime.Now < PasswordResetExpiration)
  5. ユーザーがこのパスワードをリセットできる簡単なフォームを提供します。

データベースの変更を避けたいと考えていたことは承知していますが、これがおそらく最も簡単な方法です。

于 2009-12-31T15:35:55.497 に答える
2

@アレックス

ハッシュ アルゴリズムには、.NET の System.Security.Cryptography クラスを使用することもできます。例えば:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
于 2010-10-11T18:34:49.530 に答える
1

私は間違いなくこのプロセスにデータベースを含めます。リセットが要求されたら、アカウントがロックアウトされていることを示すことをお勧めします。

たとえば、アカウントが侵害された可能性があると思われるためにpwを変更する場合、変更プロセスを実行している間、アカウントにアクセスしたままにしたくないことは間違いありません。

また、リセットトークンに「実際の」情報を含めることは、誰かが本当にそれを望んでいて、馬力を持っている場合にデコードされる可能性があります。ランダムな文字列を生成し、そのユーザーの行のデータベースに保存して、リンクがクリックされたときにキーバックする方が安全です。

これはあなたに2つのことを与えます:

1)復号化するものがないため、そこから価値を得ることができません。2)ユーザーレコードにトークンが存在することは、リセットが進行中であり、アカウントがロックアウトされているものとして扱われる必要があることを示しています。

于 2013-02-26T20:28:00.230 に答える
1

ハッシュ クラスを使用して、現在の日付/時刻とユーザーのメール アドレスで構成される一意の自動ログインを作成しました。

string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);

からハッシュ クラスを取得します。

次に、次を使用して URL から取得します。

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}
于 2009-12-31T15:36:18.687 に答える
1

ここで、友人の System.Guid クラスは、一意の (まあ、十分に一意の) 128 ビット番号を生成します。

  • 新しい Guid を生成する ( System.Guid.NewGuid() )
  • その Guid をどこかに保存します (アプリケーション オブジェクトでしょうか?)
  • その Guid を含むメールでカスタム URL を送信する
  • ユーザーがサイトにアクセスしたら、メールで送信したパスワードを入力してもらいます
  • パスワードが一致する場合は、新しいパスワードの入力を強制します
于 2009-12-31T15:31:28.797 に答える
0

ハッシュ コードを使用して、パスワード リセット URL の詳細を検証します。これはすべて、DB に何も書き込むことなく、または特権情報を攻撃者に送信することなく実行できます。

通常のパスワードのソルトとハッシュについて簡単に説明します。ソルトが1111でパスワードがであるとpasswordすると、2 つを連結して文字列をハッシュし、1111passwordこれにより のハッシュが得られるとし9999ます。次に、元のソルト1111とハッシュ9999をユーザー レコードに保存します。

パスワードを検証するときは、保存されたソルトを使用し、パスワード試行を連結してハッシュし、保存されたハッシュと比較します。たとえば、asecretになり1111asecretますが、 にハッシュされ8888ます。これは元のハッシュと一致しないため、パスワードの一致は失敗します。

もちろん、ソルトとハッシュは通常、確立された暗号ライブラリを使用して適切に生成および計算されます (自分で発明しないでください!)。

パスワード リセット URL については、ユーザーの一意の識別子、つまり電子メール アドレス、要求が行われた日付、および新しいハッシュを入力します。このハッシュは、連結されたこれらの詳細に加えて、ユーザー用に既に保存されているソルトとハッシュから生成されます。

例えば:

Email: user@example.com
Request Date: 2014-07-17
Salt: 1111
Hash: 9999

連結されたものの新しいハッシュを生成します。つまり'user@example.com2014-07-1711119999'、これが のハッシュを与えるとし7777ます。

次に生成する URL には、電子メール、要求日、および新しいハッシュが含まれます。

https:\\www.example.com\ResetPassword?email=user@example.com&requestdate=2014-07-17&hash=7777

サーバーは、電子メールと提供された日付をソルトとハッシュと組み合わせて、生成されたハッシュが提供されたものと同じであることを確認します。これが OK の場合、同じ 3 つのパラメーターが背後に隠されているリセット フォームが表示されます。それ以外の場合はエラーです。これらは、フォームのなりすましを防ぐために、新しいパスワードが入力されたときに再送信および再チェックされます。

リクエストを行うには電子メールアドレスを提供する必要があり、同じアドレスにのみ電子メールで送信されます。日付はほとんど特権情報ではなく、ハッシュは元に戻せないため、とにかく何も提供しません。データベースには何も書き込まれておらず、パラメーターが改ざんされるとハッシュが失敗し、URL でエラーが報告されます。

于 2014-07-17T11:23:31.597 に答える
0

データ|文字列をユーザーの電子メールに送信する目的は、アカウント所有者の検証です。いくつかの点に注意してください:

  • リセットまたはアクティブ化リンクで重要な情報を送信しないでください。
  • 一意の文字列データをユーザー アカウントと組み合わせて保存し、そのリンクとして送信するのが最善の方法です。ただし、セクションを 1 つだけリンクとしてユーザーの電子メールに送信し、ページでチェックインするだけでは、ブルート フォース攻撃や辞書攻撃によってアプリケーションが危険にさらされる可能性があることに注意してください。文字列のリストをチェックしていくつかのリンクを見つけ、パスワードを変更するだけで十分です。少しの可能性があることはわかっていますが、ゼロではありません。

結果:あなたのほうがいいと思います

  1. ユーザーの電子メールを文字列リンクと組み合わせてから暗号化し(ハッシュ値を逆にすることはできないため、ハッシュではありません)、ユーザーの電子メールに送信します。
  2. ユーザーがクリックすると、ページは暗号化された値を取得します。
  3. 値を解読します。
  4. ユーザーの電子メールを抽出します。
  5. データベースで電子メールを検索します。
  6. 受信したリンクの文字列を、データベース内のユーザーの電子メールに添付されている他の文字列と比較します。

幸運を。

于 2012-11-30T21:21:26.493 に答える
-3

必要に応じて、次のような形式で情報を暗号化できます。

(UserId)-(ExpireDate)

データを暗号化し、そのリンクを作成し、データを復号化し、そこからアクションを実行します...

粗雑ですが、おそらく使用可能で、DB の使用を必要としません

于 2009-12-31T15:29:10.003 に答える