0

ASP.NET MVC、エンティティフレームワーク、jQueryを使用します。ユーザーが[Rememberme]をクリックした場合に自動的にログインできるようにしたいのですが、私が思いついたアプローチは次のとおりです。

  1. ユーザーがログインしたとき
    • ユーザーがログインして「rememberme」にチェックマークが付いている場合は、PWをハッシュしてDBに保存します
    • 暗号化されたUserID、ある種のセパレーター、およびハッシュされたPWを使用してCookieを作成します。

次にユーザーが戻ってきたときに、Cookieを確認し、存在する場合はAJAXを使用してログインします。ユーザーがログアウトした場合は、もちろんCookieを削除します。

これは、自動ログイン機能を実行するための正しい方法ですか?

私のハッシュ関数とユーザーID暗号化関数はサーバー側になると思います。Cookieを作成するには、AJAXを介してその関数を呼び出してから作成します。

これはベストプラクティスですか?

ありがとうございました

4

2 に答える 2

3

あなたのアプローチ(ユーザーがログインしていることを示す値を持つCookieを持つ)はかなり標準的です。

標準ではないのは、ハッシュされたユーザー名とパスワード(特にパスワード)を保存することです-なぜ必要なのかわからず、Cookieはクリアテキストで送信されるため(http接続の場合)、サイトとユーザーの間の誰かにパスワードハッシュを確認する機能と、パスワードを取得するためにパスワードハッシュを破るチャンス。

パスワードハッシュの代わりに、Cookieに保存する一意の「loggedIn」トークン(GUIDなど)を作成します。これは、ユーザーがログインしているかどうかを判断するために比較するものです。

于 2012-08-11T08:23:38.023 に答える
1

多くの可能なアプローチの1つは次のとおりです。

注: Pure PHP でコーディングしました。しかし、ロジックはすべての言語で同じです。

  1. $redirect = FALSE に設定します。
  2. $_GET["logout"] は設定されていますか? はいの場合は 3 へ、そうでない場合は 5 へ
  3. 設定されている場合、削除、認証、rem_me Cookie、セッションの破棄。
  4. ログインフォームを表示して終了します。
  5. これは投稿リクエストですか?はいの場合は 6 へ、そうでない場合は 18 へ
  6. $redirect = TRUE に設定します。
  7. ユーザー名とパスワードは提供されていますか? はいの場合は 8 へ、そうでない場合は 3 へ
  8. $username、$pass-hash、$rem-me-hash を db から取得します。
  9. $username と $password は DB と同じですか? はいの場合は 10 へ、そうでない場合は 3 へ
  10. Set cookie["username"] = sanitized($_POST["username"])
  11. $auth = sha1(username.password.time.6random_letters) を含む Cookie["auth"] を発行します。
  12. セッション ["auth"] = sha1($auth) を設定します。$auth の設定を解除します。
  13. 記憶するオプションが選択されていますか? はいの場合は 13 へ、そうでない場合は 15 へ
  14. $rem = sha1($user_string.$time.$password.$username.$random) を設定します。
  15. cookie["rem"] = $rem を設定
  16. $rem = 0 に設定
  17. $rem != $rem-me-hash_DB の場合、$rem を DB に挿入します。23へ
  18. $rem Cookie は設定されていますか? はいは 19 へ、それ以外は 20 へ
  19. $rem cookie == $rem-hash-in-db ですか? はいの場合は 22 へ、そうでない場合は 3 へ
  20. $username-cookie && $auth-cookie &&auth-SESSION は設定されていますか? はいの場合は 21 へ、そうでない場合は 3 へ
  21. sha1($auth-cookie) === $_SESSION["auth"] ですか? はいの場合は 22 へ、そうでない場合は 3 へ
  22. $redirect == TRUE ですか? はいの場合は、301、GET メソッドを使用してこの同じページにリダイレクトします。そうでなければ23へ
  23. これが私の超秘密のスタートレックの壁紙(コンテンツ)です。

長いプロセスですが、(できれば) すべてのシナリオを網羅しています。

このすべてのアルゴリズムを に保存し、password.php保護するすべてのファイルの上にこのファイルを含めます。秘密のコンテンツに対する制御は、考えられるすべてのシナリオを通過した場合にのみ実現されます。エラーが発生するたびに、スクリプトはログイン フォームを表示して終了します。

また、Post-Redirect-Get ( Wikipedia ) アプローチを実装します。このアプローチでは、POST 要求を取得して処理し、ユーザーを GET メソッドでリダイレクトして、[戻る] ボタンと [更新] ボタンを押したときにフォームが二重に送信されるのを防ぎます。

上記の説明には、タイプミスまたは混合概念がある可能性があります。改善点があれば教えてください。

于 2012-08-11T09:23:29.910 に答える