Webサイトにパスワードを忘れた場合の機能を実装したいと考えています。一時的に使用する一時的なURLを含むメールが、しばらくするとユーザーに送信されるオプションが気に入っています。
これらのアイデアを得るために次のページを確認しましたが、ASP.NETとC#を使用してこれを実装する方法がわかりません。ユーザーの1人が示したように、データベース内にこの情報を保存せずにこれを実装できる場合、それは理想的です。お知らせ下さい。
ありがとう。
おそらく最も簡単な方法は、ユーザーテーブルを変更して2つの列を追加することです。OR既存のテーブルを変更したくない場合は、「UserPasswordReset」という新しい依存テーブルを追加できます。 "またはそのようなものです。列は次のようになります:
PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME
追加のテーブルルートを使用する場合は、UserID列を追加して、それを主キーにし、ユーザーテーブルへの外部キー参照にすることもできます。 UNIQUE制約も推奨されます。次に、asp.netアプリケーションのGuidをトークンとして使用します。
フローは次のようになります。
データベースの変更を避けたかったのは確かですが、おそらくこれがおそらく最も簡単な方法です。
@アレックス
ハッシュアルゴリズムには、.NETのSystem.Security.Cryptographyクラスを使用することもできます。例えば:
using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
私は間違いなくこのプロセスにデータベースを含めます。リセットが要求されたら、アカウントがロックアウトされていることを示すことをお勧めします。
たとえば、アカウントが侵害された可能性があると考えてパスワードを変更している場合、変更プロセスを実行している間、アカウントにアクセス可能な状態を維持したくはありません。
また、リセットトークンに「実際の」情報が含まれていることは、誰かが本当にそれを望んでおり、馬力がある場合にデコードされる可能性があります。ランダムな文字列を生成し、そのユーザーの行のdbに保存してから、リンクがクリックされたときにキーに戻る方が安全です。
これにより、次の2つが得られます。
1)復号化するものは何もないため、そこから価値を得ることができません。 2)ユーザーレコード内のトークンの存在は、リセットが進行中であり、アカウントはロックアウトされたものとして扱われるべきであることを示しています。
ここでは、あなたの友達のSystem.Guidクラスが一意の(十分に一意の)128ビット数を生成するためです。
私はハッシュクラスを使用して、現在の日付/時刻とユーザーのメールアドレスで構成される一意の自動ログインを作成しました。
string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);
ハッシュクラスを取得: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/
次に、以下を使用してURLから取得します。
if (Request.QueryString["hash"] != null)
{
//extract Hash from the URL
string strHash = Request.QueryString["hash"];
}
ユーザーのメールにデータ|文字列を送信する目的は、アカウント所有者の検証です。いくつかの点に注意してください:
結果:あなたはそれが良いと思います
幸運を。
ハッシュコードを使用して、パスワードリセットURLの詳細を検証します。これはすべて、DBに何かを書き込んだり、権限のある情報を取得者に送信したりせずに実行できます。
通常のパスワードソルトとハッシュについて簡単に説明します。 saltが1111
で、パスワードがpassword
だとすると、2つを連結して文字列1111password
をハッシュします。これにより、9999
のハッシュが得られます。次に、元のソルト1111
とハッシュ9999
をユーザーレコードに保存します。
パスワードを検証するときは、保存されているソルトを使用し、パスワードの試行を連結し、ハッシュして、保存されているハッシュと比較します。たとえば、asecret
は1111asecret
になりますが、8888
にハッシュされます。これは元のハッシュと一致しないため、パスワードの一致は失敗します。
もちろん、saltとhashは通常、適切に生成され、確立された暗号ライブラリで計算されます(自分で作成しないでください!)。
パスワードリセットURLの場合、ユーザーの一意の識別子(電子メールアドレス)、要求が行われた日付、および新しいハッシュを入力します。このハッシュは、一緒に連結された詳細に加えて、ユーザー用にすでに保存されているソルトとハッシュから生成されます。
例えば:
Email: [email protected]
Request Date: 2014-07-17
Salt: 1111
Hash: 9999
連結されたものの新しいハッシュ、つまり'[email protected]'
を生成します。これにより、7777
のハッシュが得られると言います。
次に、生成するURLには、電子メール、要求日、および新しいハッシュが含まれます。
https:\\www.example.com\[email protected]&requestdate=2014-07-17&hash=7777
サーバーは、電子メールと指定された日付をソルトおよびハッシュと組み合わせ、生成されたハッシュが指定されたものと同じであることを確認します。これがOkの場合、同じ3つのパラメータが背後に隠されたリセットフォームが表示されます。それ以外の場合はエラーになります。これらは再送信され、新しいパスワードが入力されると再確認され、フォームのなりすましを防ぎます。
リクエストを行うにはメールアドレスを指定する必要があります。メールアドレスは同じアドレスにのみ送信されます。日付はほとんど特権化された情報ではなく、ハッシュは元に戻すことができないため、何も与えられません。データベースには何も書き込まれておらず、パラメーターを改ざんするとハッシュが失敗し、URLがエラーを報告します。
このアプローチには問題があります。安全なハッシュはトークンを本当に長くします。ソルトをハッシュ自体に統合する(約20文字長くする)か、この固有のソルトをデータベースに保存します。ソルトをデータベースに格納する場合、既存のトークンから派生していないランダムトークンを格納することもできます。